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
#include <iostream>
#include <set>
#include <vector>

#define ull unsigned long long

using namespace std;

int n;

int main() {
    int m, q;
    cin >> n >> m >> q;
    const int setsize = (n + 63) / 64;
    vector<vector<ull>> sets(n + m, vector<ull>(setsize, 0));

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j <= n; j += i + 1)  //
            sets[i][(j - 1) / 64] |= ((ull)1 << (j - 1) % 64);
    }

    // struct instr {
    //     int type, a, b;
    // };
    // vector<instr> instrs(m);
    // for (auto &i : instrs) {
    //     cin >> i.type >> i.a;
    //     if (i.type != 3) cin >> i.b;
    // }
    for (int i = n; i < n + m; i++) {
        int type, x, y;
        cin >> type;
        switch (type) {
            case 1:
                cin >> x >> y;
                for (int j = 0; j < setsize; j++) {
                    sets[i][j] = sets[x - 1][j] | sets[y - 1][j];
                }
                break;
            case 2:
                cin >> x >> y;
                for (int j = 0; j < setsize; j++) {
                    sets[i][j] = sets[x - 1][j] & sets[y - 1][j];
                }
                break;
            case 3:
                cin >> x;
                for (int j = 0; j < setsize; j++) {
                    sets[i][j] = ~sets[x - 1][j];
                }
                break;
        }
    }

    // vector<set<int>> ques(m);
    // for (int i = 0; i < q; i++) {
    //     int x, v;
    //     cin >> x >> v;
    //     ques[x - 1].insert(v);
    // }
    for (int i = 0; i < q; i++) {
        int x, v;
        cin >> x >> v;
        x--, v--;
        if (sets[x][v / 64] & (ull)1 << v % 64)  //
            cout << "TAK\n";                     //
        else
            cout << "NIE\n";
    }
}