#include "bits/stdc++.h"
using namespace std;
#define rep(i,a,b) for(int i=(a); i<(b); ++i)
#define all(x) x.begin(),x.end()
#define sz(x) int(x.size())
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;
const int N = 50100, M = 400010;
const int tr = 20;
const int B = N/tr;
typedef bitset<B> bs;
bs sets[N+M];
int main(){
cin.tie(NULL),cin.sync_with_stdio(false);
int n,m,q; cin >> n >> m >> q;
vector<bool> ans(q);
vector<array<int,3>> uds(m);
vector<array<int,2>> qs(q);
rep(i,0,m){
int t; cin >> t;
if (t==1){
int x,y; cin >> x >> y; --x, --y;
// sets[n+i] = sets[x] | sets[y];
uds[i] = {1,x,y};
}else if (t==2){
int x,y; cin >> x >> y; --x, --y;
// sets[n+i] = sets[x] & sets[y];
uds[i] = {2,x,y};
}else{
int x; cin >> x;
--x;
// sets[n+i] = ~sets[x];
uds[i] = {3,x,0};
}
}
rep(i,0,q){
rep(j,0,2) cin >> qs[i][j];
}
rep(bl,0,tr){
rep(i,0,n){
sets[i] = 0;
int d = i+1;
for(int j = max(d,((bl*B + d-1)/d)*d); j < (bl+1)*B; j += d){
sets[i][j - bl*B] = 1;
}
}
rep(i,0,m){
auto x = uds[i][1], y = uds[i][2];
if (uds[i][0] == 1){
sets[n+i] = sets[x] | sets[y];
}else if(uds[i][0] == 2){
sets[n+i] = sets[x] & sets[y];
}else{
sets[n+i] = ~sets[x];
}
}
rep(i,0,q){
int x = qs[i][0]-1, v = qs[i][1];
if (bl*B <= v and v < (bl+1)*B){
if (sets[x][v-bl*B]) ans[i] = 1;
else ans[i] = 0;
}
}
}
for(auto c : ans){
if (c) cout << "TAK\n";
else cout << "NIE\n";
}
}
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 | #include "bits/stdc++.h" using namespace std; #define rep(i,a,b) for(int i=(a); i<(b); ++i) #define all(x) x.begin(),x.end() #define sz(x) int(x.size()) typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef vector<vi> vvi; const int N = 50100, M = 400010; const int tr = 20; const int B = N/tr; typedef bitset<B> bs; bs sets[N+M]; int main(){ cin.tie(NULL),cin.sync_with_stdio(false); int n,m,q; cin >> n >> m >> q; vector<bool> ans(q); vector<array<int,3>> uds(m); vector<array<int,2>> qs(q); rep(i,0,m){ int t; cin >> t; if (t==1){ int x,y; cin >> x >> y; --x, --y; // sets[n+i] = sets[x] | sets[y]; uds[i] = {1,x,y}; }else if (t==2){ int x,y; cin >> x >> y; --x, --y; // sets[n+i] = sets[x] & sets[y]; uds[i] = {2,x,y}; }else{ int x; cin >> x; --x; // sets[n+i] = ~sets[x]; uds[i] = {3,x,0}; } } rep(i,0,q){ rep(j,0,2) cin >> qs[i][j]; } rep(bl,0,tr){ rep(i,0,n){ sets[i] = 0; int d = i+1; for(int j = max(d,((bl*B + d-1)/d)*d); j < (bl+1)*B; j += d){ sets[i][j - bl*B] = 1; } } rep(i,0,m){ auto x = uds[i][1], y = uds[i][2]; if (uds[i][0] == 1){ sets[n+i] = sets[x] | sets[y]; }else if(uds[i][0] == 2){ sets[n+i] = sets[x] & sets[y]; }else{ sets[n+i] = ~sets[x]; } } rep(i,0,q){ int x = qs[i][0]-1, v = qs[i][1]; if (bl*B <= v and v < (bl+1)*B){ if (sets[x][v-bl*B]) ans[i] = 1; else ans[i] = 0; } } } for(auto c : ans){ if (c) cout << "TAK\n"; else cout << "NIE\n"; } } |
English