#include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map>
#include <algorithm>
#include <iterator>
// void print(const std::unordered_set<unsigned long long>& s) {
// std::cout << "{";
// for (const auto elem : s) {
// std::cout << elem << ", ";
// }
// std::cout << "}\n";
// }
enum OperationType {
SUM = 1,
INTERSECTION = 2,
NEGATION = 3
};
struct Data {
unsigned long long n;
unsigned long long m;
unsigned long long q;
std::unordered_map<unsigned long long, std::unordered_set<unsigned long long>> sets;
} data;
void ReadData() {
std::cin >> data.n >> data.m >> data.q;
for (unsigned long long i = 1; i <= data.n; ++i) {
std::unordered_set<unsigned long long> s;
for (unsigned long long j = data.n; j >= i; --j) {
if (j % i == 0)
s.insert(j);
}
data.sets[i] = s;
}
for (unsigned long long i = data.n+1; i <= data.n + data.m; ++i) {
int type;
unsigned long long x, y;
std::cin >> type;
std::unordered_set<unsigned long long> s;
std::unordered_set<unsigned long long> sx;
std::unordered_set<unsigned long long> sy;
switch (type) {
case SUM:
std::cin >> x >> y;
s = data.sets[x];
sy = data.sets[y];
for (const auto elem : sy) s.insert(elem);
break;
case INTERSECTION:
std::cin >> x >> y;
sx = data.sets[x];
sy = data.sets[y];
for (const auto elem : sx) {
if (sy.contains(elem))
s.insert(elem);
}
break;
case NEGATION:
std::cin >> x;
sx = data.sets[x];
for (unsigned long long j = data.n; j >= 1; --j) {
if (!sx.contains(j))
s.insert(j);
}
break;
default: break;
}
// print(s);
data.sets[i] = s;
}
}
void handleQuestions() {
for (unsigned long long i = 0; i < data.q; ++i) {
unsigned long long x, v;
std::cin >> x >> v;
if (data.sets[x].contains(v))
std::cout << "TAK\n";
else
std::cout << "NIE\n";
}
}
int main() {
ReadData();
handleQuestions();
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 96 | #include <iostream> #include <vector> #include <unordered_set> #include <unordered_map> #include <algorithm> #include <iterator> // void print(const std::unordered_set<unsigned long long>& s) { // std::cout << "{"; // for (const auto elem : s) { // std::cout << elem << ", "; // } // std::cout << "}\n"; // } enum OperationType { SUM = 1, INTERSECTION = 2, NEGATION = 3 }; struct Data { unsigned long long n; unsigned long long m; unsigned long long q; std::unordered_map<unsigned long long, std::unordered_set<unsigned long long>> sets; } data; void ReadData() { std::cin >> data.n >> data.m >> data.q; for (unsigned long long i = 1; i <= data.n; ++i) { std::unordered_set<unsigned long long> s; for (unsigned long long j = data.n; j >= i; --j) { if (j % i == 0) s.insert(j); } data.sets[i] = s; } for (unsigned long long i = data.n+1; i <= data.n + data.m; ++i) { int type; unsigned long long x, y; std::cin >> type; std::unordered_set<unsigned long long> s; std::unordered_set<unsigned long long> sx; std::unordered_set<unsigned long long> sy; switch (type) { case SUM: std::cin >> x >> y; s = data.sets[x]; sy = data.sets[y]; for (const auto elem : sy) s.insert(elem); break; case INTERSECTION: std::cin >> x >> y; sx = data.sets[x]; sy = data.sets[y]; for (const auto elem : sx) { if (sy.contains(elem)) s.insert(elem); } break; case NEGATION: std::cin >> x; sx = data.sets[x]; for (unsigned long long j = data.n; j >= 1; --j) { if (!sx.contains(j)) s.insert(j); } break; default: break; } // print(s); data.sets[i] = s; } } void handleQuestions() { for (unsigned long long i = 0; i < data.q; ++i) { unsigned long long x, v; std::cin >> x >> v; if (data.sets[x].contains(v)) std::cout << "TAK\n"; else std::cout << "NIE\n"; } } int main() { ReadData(); handleQuestions(); return 0; } |
English