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

using namespace std;

int main()
{
	int n, m, q;
	cin >> n >> m >> q;

	set<int> *sets = new set<int>[n+m];
	set<int> universe;
	for (int i = 1; i <= n; i++)
	{
		universe.insert(universe.end(), i);
	}



	for (int i = 0; i < n; i++)
	{
		set<int>& c = sets[i];   
		int v = i + 1;
		for (int j = v; j <= n; j+=v)
		{
			c.insert(c.end(), j);
		}
	}

	for (int i = 0; i < m; i++) {
		int operation, x, y;
		cin >> operation >> x;
		x--;
		set<int>& c = sets[n+i];

		if (operation == 1) {
			cin >> y;
			y--;
			set_union(sets[x].begin(), sets[x].end(),  sets[y].begin(), sets[y].end(), inserter(c, c.begin()));
		}
		else if (operation == 2) {
			cin >> y;
			y--;
			set_intersection(sets[x].begin(), sets[x].end(), sets[y].begin(), sets[y].end(), inserter(c, c.begin()));
		}
		else if (operation == 3) {
			set_difference(universe.begin(), universe.end(), sets[x].begin(), sets[x].end(), inserter(c, c.begin()));
		}
	}


	for (int i = 0; i < q; i++) {
		int x, v;
		cin >> x >> v;
		x--;
		if (sets[x].find(v) == sets[x].end()) {
			cout << "NIE" << endl;
		}
		else {
			cout << "TAK" << endl;
		}
	}


	delete[] sets;
	return 0;
}