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