#include <iostream>
#include <vector>
#define MAX_N 50000
#define MAX_M 400000
int n;
class bit_array_t {
uint64_t data[(MAX_N + 63) / 64] = {0};
public:
void set(size_t pos) {
data[pos / 64] |= (1ULL << (pos % 64));
}
bool get(size_t pos) const {
return data[pos / 64] & (1ULL << (pos % 64));
}
void set_or(const bit_array_t& a, const bit_array_t& b) {
for (size_t i = 0; i < (n + 63) / 64; ++i) {
data[i] = a.data[i] | b.data[i];
}
}
void set_and(const bit_array_t& a, const bit_array_t& b) {
for (size_t i = 0; i < (n + 63) / 64; ++i) {
data[i] = a.data[i] & b.data[i];
}
}
void set_neg(const bit_array_t& a) {
for (size_t i = 0; i < (n + 63) / 64; ++i) {
data[i] = ~a.data[i];
}
}
void print()
{
for (size_t i = 0; i < n; ++i) {
if (get(i)) std::cout << i + 1 << " ";
}
std::cout << std::endl;
}
};
int main()
{
int m, q;
std::cin >> n >> m >> q;
bit_array_t* bit_arrays = new bit_array_t[n + m];
for (int i = 0; i < n; ++i)
{
bit_array_t& bit_array = bit_arrays[i];
int j = i;
while (j < n)
{
bit_array.set(j);
j += i + 1;
}
//bit_array.print();
}
for (int i = 0; i < m; ++i)
{
int op, x, y = 1;
std::cin >> op >> x;
if (op != 3) std::cin >> y;
const bit_array_t& bit_array_x = bit_arrays[x - 1];
const bit_array_t& bit_array_y = bit_arrays[y - 1];
bit_array_t& bit_array = bit_arrays[n + i];
switch (op)
{
case 1: bit_array.set_or(bit_array_x, bit_array_y); break;
case 2: bit_array.set_and(bit_array_x, bit_array_y); break;
case 3: bit_array.set_neg(bit_array_x); break;
}
//bit_array.print();
}
for (int i = 0; i < q; ++i)
{
int x, v;
std::cin >> x >> v;
bool answer = bit_arrays[x - 1].get(v - 1);
std::cout << (answer ? "TAK" : "NIE") << std::endl;
}
std::cout.flush();
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include <iostream> #include <vector> #define MAX_N 50000 #define MAX_M 400000 int n; class bit_array_t { uint64_t data[(MAX_N + 63) / 64] = {0}; public: void set(size_t pos) { data[pos / 64] |= (1ULL << (pos % 64)); } bool get(size_t pos) const { return data[pos / 64] & (1ULL << (pos % 64)); } void set_or(const bit_array_t& a, const bit_array_t& b) { for (size_t i = 0; i < (n + 63) / 64; ++i) { data[i] = a.data[i] | b.data[i]; } } void set_and(const bit_array_t& a, const bit_array_t& b) { for (size_t i = 0; i < (n + 63) / 64; ++i) { data[i] = a.data[i] & b.data[i]; } } void set_neg(const bit_array_t& a) { for (size_t i = 0; i < (n + 63) / 64; ++i) { data[i] = ~a.data[i]; } } void print() { for (size_t i = 0; i < n; ++i) { if (get(i)) std::cout << i + 1 << " "; } std::cout << std::endl; } }; int main() { int m, q; std::cin >> n >> m >> q; bit_array_t* bit_arrays = new bit_array_t[n + m]; for (int i = 0; i < n; ++i) { bit_array_t& bit_array = bit_arrays[i]; int j = i; while (j < n) { bit_array.set(j); j += i + 1; } //bit_array.print(); } for (int i = 0; i < m; ++i) { int op, x, y = 1; std::cin >> op >> x; if (op != 3) std::cin >> y; const bit_array_t& bit_array_x = bit_arrays[x - 1]; const bit_array_t& bit_array_y = bit_arrays[y - 1]; bit_array_t& bit_array = bit_arrays[n + i]; switch (op) { case 1: bit_array.set_or(bit_array_x, bit_array_y); break; case 2: bit_array.set_and(bit_array_x, bit_array_y); break; case 3: bit_array.set_neg(bit_array_x); break; } //bit_array.print(); } for (int i = 0; i < q; ++i) { int x, v; std::cin >> x >> v; bool answer = bit_arrays[x - 1].get(v - 1); std::cout << (answer ? "TAK" : "NIE") << std::endl; } std::cout.flush(); return 0; } |
English