import sys
import numpy as np # NumPy importowany – przydatny, gdybyśmy chcieli wykonywać operacje wektorowe
def main():
data = sys.stdin.buffer.read().split()
it = iter(data)
n = int(next(it))
m = int(next(it))
q = int(next(it))
# Precompute tablica "base" – base[j] = 1 << j dla 0 <= j < n
base = [0] * n
base[0] = 1
for j in range(1, n):
base[j] = base[j - 1] << 1
total = n + m # liczba wszystkich zbiorów (indeksujemy od 1)
sets = [0] * (total + 1)
# Inicjalizacja zbiorów początkowych A1...An:
# Dla i=1,...,n: A_i = {j : j mod i == 0} – czyli ustawiamy bity dla pozycji j-1, gdzie j jest wielokrotnością i.
for i in range(1, n + 1):
s = 0
# indeksy: j = i, 2*i, 3*i, ... <= n; odpowiadają bity o indeksach j-1
for j in range(i - 1, n, i):
s |= base[j]
sets[i] = s
# Maska zawierająca bity [0, n-1] ustawione na 1
mask = (1 << n) - 1
# Przetwarzamy m operacji – dla operacji nowe zbiory mają indeksy n+1, n+2, ... n+m
for i in range(1, m + 1):
op = next(it) # op jest typu bytes (np. b'1', b'2', b'3')
idx = n + i
if op == b'1': # suma
x = int(next(it))
y = int(next(it))
sets[idx] = sets[x] | sets[y]
elif op == b'2': # przecięcie
x = int(next(it))
y = int(next(it))
sets[idx] = sets[x] & sets[y]
elif op == b'3': # negacja
x = int(next(it))
sets[idx] = mask ^ sets[x]
# Odpowiadamy na q zapytań
out_lines = []
for _ in range(q):
x = int(next(it))
v = int(next(it))
# Sprawdzamy, czy bit (v-1) jest ustawiony:
if (sets[x] >> (v - 1)) & 1:
out_lines.append("TAK")
else:
out_lines.append("NIE")
sys.stdout.write("\n".join(out_lines))
if __name__ == '__main__':
main()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import sys import numpy as np # NumPy importowany – przydatny, gdybyśmy chcieli wykonywać operacje wektorowe def main(): data = sys.stdin.buffer.read().split() it = iter(data) n = int(next(it)) m = int(next(it)) q = int(next(it)) # Precompute tablica "base" – base[j] = 1 << j dla 0 <= j < n base = [0] * n base[0] = 1 for j in range(1, n): base[j] = base[j - 1] << 1 total = n + m # liczba wszystkich zbiorów (indeksujemy od 1) sets = [0] * (total + 1) # Inicjalizacja zbiorów początkowych A1...An: # Dla i=1,...,n: A_i = {j : j mod i == 0} – czyli ustawiamy bity dla pozycji j-1, gdzie j jest wielokrotnością i. for i in range(1, n + 1): s = 0 # indeksy: j = i, 2*i, 3*i, ... <= n; odpowiadają bity o indeksach j-1 for j in range(i - 1, n, i): s |= base[j] sets[i] = s # Maska zawierająca bity [0, n-1] ustawione na 1 mask = (1 << n) - 1 # Przetwarzamy m operacji – dla operacji nowe zbiory mają indeksy n+1, n+2, ... n+m for i in range(1, m + 1): op = next(it) # op jest typu bytes (np. b'1', b'2', b'3') idx = n + i if op == b'1': # suma x = int(next(it)) y = int(next(it)) sets[idx] = sets[x] | sets[y] elif op == b'2': # przecięcie x = int(next(it)) y = int(next(it)) sets[idx] = sets[x] & sets[y] elif op == b'3': # negacja x = int(next(it)) sets[idx] = mask ^ sets[x] # Odpowiadamy na q zapytań out_lines = [] for _ in range(q): x = int(next(it)) v = int(next(it)) # Sprawdzamy, czy bit (v-1) jest ustawiony: if (sets[x] >> (v - 1)) & 1: out_lines.append("TAK") else: out_lines.append("NIE") sys.stdout.write("\n".join(out_lines)) if __name__ == '__main__': main() |
English