#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; } |