#include <algorithm>
#include <cstddef>
#include <iostream>
#include <iterator>
#include <set>
#include <sstream>
#include <string>
#include <vector>
std::string set_to_string(const std::set<int> &set, size_t n) {
std::ostringstream sb;
sb << "A[" << n << "] = [";
for (auto it = set.begin(); it != set.end(); ++it) {
if (it != set.begin())
sb << ",";
sb << *it;
}
sb << "]";
return sb.str();
}
int main() {
int n, m, q;
std::cin >> n >> m >> q;
std::vector<std::set<int>> sets;
sets.reserve(n + m);
for (int i = 1; i <= n; ++i) {
std::set<int> s;
for (int j = i; j <= n; j += i) {
s.insert(j);
}
sets.emplace_back(std::move(s));
}
for (int i = 0; i < m; ++i) {
int operation_type, left_set_idx, right_set_idx;
std::cin >> operation_type >> left_set_idx;
--left_set_idx;
std::set<int> result;
if (operation_type == 3) {
std::set_difference(sets[0].begin(), sets[0].end(),
sets[left_set_idx].begin(), sets[left_set_idx].end(),
std::inserter(result, result.begin()));
} else {
std::cin >> right_set_idx;
--right_set_idx;
if (operation_type == 1) {
std::set_union(sets[left_set_idx].begin(), sets[left_set_idx].end(),
sets[right_set_idx].begin(), sets[right_set_idx].end(),
std::inserter(result, result.begin()));
} else {
std::set_intersection(
sets[left_set_idx].begin(), sets[left_set_idx].end(),
sets[right_set_idx].begin(), sets[right_set_idx].end(),
std::inserter(result, result.begin()));
}
}
sets.emplace_back(std::move(result));
}
for (int i = 0; i < q; ++i) {
int set_idx, searched_value;
std::cin >> set_idx >> searched_value;
--set_idx;
std::cout << (sets[set_idx].find(searched_value) != sets[set_idx].end()
? "TAK"
: "NIE")
<< '\n';
}
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 | #include <algorithm> #include <cstddef> #include <iostream> #include <iterator> #include <set> #include <sstream> #include <string> #include <vector> std::string set_to_string(const std::set<int> &set, size_t n) { std::ostringstream sb; sb << "A[" << n << "] = ["; for (auto it = set.begin(); it != set.end(); ++it) { if (it != set.begin()) sb << ","; sb << *it; } sb << "]"; return sb.str(); } int main() { int n, m, q; std::cin >> n >> m >> q; std::vector<std::set<int>> sets; sets.reserve(n + m); for (int i = 1; i <= n; ++i) { std::set<int> s; for (int j = i; j <= n; j += i) { s.insert(j); } sets.emplace_back(std::move(s)); } for (int i = 0; i < m; ++i) { int operation_type, left_set_idx, right_set_idx; std::cin >> operation_type >> left_set_idx; --left_set_idx; std::set<int> result; if (operation_type == 3) { std::set_difference(sets[0].begin(), sets[0].end(), sets[left_set_idx].begin(), sets[left_set_idx].end(), std::inserter(result, result.begin())); } else { std::cin >> right_set_idx; --right_set_idx; if (operation_type == 1) { std::set_union(sets[left_set_idx].begin(), sets[left_set_idx].end(), sets[right_set_idx].begin(), sets[right_set_idx].end(), std::inserter(result, result.begin())); } else { std::set_intersection( sets[left_set_idx].begin(), sets[left_set_idx].end(), sets[right_set_idx].begin(), sets[right_set_idx].end(), std::inserter(result, result.begin())); } } sets.emplace_back(std::move(result)); } for (int i = 0; i < q; ++i) { int set_idx, searched_value; std::cin >> set_idx >> searched_value; --set_idx; std::cout << (sets[set_idx].find(searched_value) != sets[set_idx].end() ? "TAK" : "NIE") << '\n'; } return 0; } |
English