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