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
| #include<bits/stdc++.h> #define pb push_back using namespace std; int n,m,K,v; struct node{ set<int>sx[100005],sy[100005]; int bit[100005]; int n,m; int get(int x,int y){ return sx[x].count(y); } void add(int x,int y){ for(x++;x<=n;x+=x&-x)bit[x]=max(bit[x],y); } int qmax(int x){ int y(0); for(x++;x;x-=x&-x)y=max(y,bit[x]); return y; } int query(int x,int y){ if(x==0)return qmax(x)>=y; return qmax(x-1)<=y&&y<=qmax(x); } void upd(int x,int y){ if(!query(x,y))return; add(x-1,y+1),x--,y++; if(sx[x].size()&&sx[x].upper_bound(y)!=sx[x].begin()){ auto it=--sx[x].upper_bound(y); upd(x,*it); } if(sy[y].size()&&sy[y].lower_bound(x)!=sy[y].end()){ auto it=sy[y].lower_bound(x); upd(*it,y); } } void ins(int x,int y){ sx[x].insert(y),sy[y].insert(x); upd(x,y); } }R,D; int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>m>>K; D.n=n,D.m=m; R.n=m,R.m=n; D.add(n-1,m-1); R.add(m-1,n-1); for(int i=1;i<=K;i++){ int r,c,z; cin>>r>>c>>z; r=(r^v)%n,c=(c^v)%m; if(D.get(r,c)){ cout<<"NIE"<<"\n"; } else if(D.query(r,c)&&R.query(c,r)){ cout<<"TAK"<<"\n"; v^=z; } else{ cout<<"NIE"<<"\n"; D.ins(r,c),R.ins(c,r); } } }
|