// PA2025, @mjm, r0-zb1
#include <cstdio>
#include <vector>
using namespace std;
int nextInt() { int n; scanf("%d", &n); return n; }
using ull = unsigned long long;
const int BS = sizeof(ull) * 8;
vector<vector<ull>> s;
int n;
int m;
int bc;
void mySet(int id, int val) {
int idx = val / BS;
int bit = val % BS;
ull mask = 1;
mask <<= bit;
s[id][idx] |= mask;
}
bool myGet(int id, int val) {
int idx = val / BS;
int bit = val % BS;
ull mask = 1;
mask <<= bit;
ull res = (s[id][idx]) & mask;
const ull ZERO = 0;
return res != ZERO;
}
int main() {
n = nextInt();
m = nextInt();
int q = nextInt();
bc = (n + BS) / BS;
s.resize(n + m + 1);
// 1 ... n
for (int i = 1; i <= n; ++i) {
s[i].resize(bc);
for (int j = i; j <= n; j += i) {
mySet(i, j);
}
}
// n+1 ... n+m
for (int i = 1; i <= m; ++i) {
s[n + i].resize(bc);
int cmd = nextInt();
int x = nextInt();
if (1 == cmd) {
int y = nextInt();
for (int k = 0; k < bc; ++k)
s[n + i][k] = (s[x][k]) | (s[y][k]);
}
if (2 == cmd) {
int y = nextInt();
for (int k = 0; k < bc; ++k)
s[n + i][k] = (s[x][k]) & (s[y][k]);
}
if (3 == cmd) {
for (int k = 0; k < bc; ++k)
s[n + i][k] = ~(s[x][k]);
}
}
// queries: 1 ... q
for (int i = 0; i < q; ++i) {
int x = nextInt();
int val = nextInt();
bool res = myGet(x, val);
printf("%s\n", res ? "TAK" : "NIE");
}
return 0;
}
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | // PA2025, @mjm, r0-zb1 #include <cstdio> #include <vector> using namespace std; int nextInt() { int n; scanf("%d", &n); return n; } using ull = unsigned long long; const int BS = sizeof(ull) * 8; vector<vector<ull>> s; int n; int m; int bc; void mySet(int id, int val) { int idx = val / BS; int bit = val % BS; ull mask = 1; mask <<= bit; s[id][idx] |= mask; } bool myGet(int id, int val) { int idx = val / BS; int bit = val % BS; ull mask = 1; mask <<= bit; ull res = (s[id][idx]) & mask; const ull ZERO = 0; return res != ZERO; } int main() { n = nextInt(); m = nextInt(); int q = nextInt(); bc = (n + BS) / BS; s.resize(n + m + 1); // 1 ... n for (int i = 1; i <= n; ++i) { s[i].resize(bc); for (int j = i; j <= n; j += i) { mySet(i, j); } } // n+1 ... n+m for (int i = 1; i <= m; ++i) { s[n + i].resize(bc); int cmd = nextInt(); int x = nextInt(); if (1 == cmd) { int y = nextInt(); for (int k = 0; k < bc; ++k) s[n + i][k] = (s[x][k]) | (s[y][k]); } if (2 == cmd) { int y = nextInt(); for (int k = 0; k < bc; ++k) s[n + i][k] = (s[x][k]) & (s[y][k]); } if (3 == cmd) { for (int k = 0; k < bc; ++k) s[n + i][k] = ~(s[x][k]); } } // queries: 1 ... q for (int i = 0; i < q; ++i) { int x = nextInt(); int val = nextInt(); bool res = myGet(x, val); printf("%s\n", res ? "TAK" : "NIE"); } return 0; } |
English