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
| const int N=2e5+10,P=998244353;
int n,m,q; int X[N],Y[N]; int A[N*20],B[N*20],C[N*20],T; int ans; void Add(int x,int y){ int t=x&1; x=(x+1)/2,y=(y+1)/2; if(t) { for(int i=x;i<=n;i+=i&-i) ans+=Y[i]>=y; for(int i=x;i<=n;i+=i&-i) if(X[i]>y) A[++T]=0,B[T]=i,C[T]=X[i],X[i]=y; } else { for(int i=x;i;i-=i&-i) ans+=X[i]<=y; for(int i=x;i;i-=i&-i) if(Y[i]<y) A[++T]=1,B[T]=i,C[T]=Y[i],Y[i]=y; } } void Back(){ if(A[T]==0) X[B[T]]=C[T]; else Y[B[T]]=C[T]; T--; }
map <Pii,int> M; vector <Pii> G[N<<2]; void Ins(int p,int l,int r,int ql,int qr,Pii x){ if(ql<=l && r<=qr) return G[p].pb(x); int mid=(l+r)>>1; if(ql<=mid) Ins(p<<1,l,mid,ql,qr,x); if(qr>mid) Ins(p<<1|1,mid+1,r,ql,qr,x); }
void Solve(int p,int l,int r){ int t1=T,t2=ans; for(auto i:G[p]) Add(i.first,i.second); if(l==r) puts(ans?"NO":"YES"); else { int mid=(l+r)>>1; Solve(p<<1,l,mid),Solve(p<<1|1,mid+1,r); } while(T>t1) Back(); ans=t2; }
int main(){ memset(X,10,sizeof X); n=rd(),m=rd(),q=rd(); rep(i,1,q) { int x=rd(),y=rd(); Pii t(x,y); if(M[t]==0) M[t]=i; else Ins(1,1,q,M[t],i-1,t),M[t]=0; } for(auto i:M) if(i.second!=0) Ins(1,1,q,i.second,q,i.first); Solve(1,1,q); }
|