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
| const int N=2e5+10;
int n,m,c; map <int,int> M[N],I[N]; vector <int> T[N*2]; int P[N*2];
int stk[N],top,S[N],F[N]; int Find(int x){ while(F[x]!=x) x=x[F][F]; return x; } void Union(int x,int y){ x=Find(x),y=Find(y); if(x==y) return; if(S[x]>S[y]) swap(x,y); F[x]=y,S[y]+=S[x],stk[++top]=x; } void Back(){ int x=stk[top--]; S[F[x]]-=S[x],F[x]=x; }
vector <Pii> G[N<<2]; void Add(int p,int l,int r,int ql,int qr,Pii x){ if(ql>qr) return; if(ql<=l && r<=qr) return G[p].pb(x); int mid=(l+r)>>1; if(ql<=mid) Add(p<<1,l,mid,ql,qr,x); if(qr>mid) Add(p<<1|1,mid+1,r,ql,qr,x); } int opt[N],A[N],B[N],lst; void Solve(int p,int l,int r){ int tmp=top; for(Pii t:G[p]) Union(t.first,t.second); if(l==r) { int x=(A[l]+lst-1)%n+1; int y=(B[l]+lst-1)%n+1; if(x>y) swap(x,y); if(opt[l]==1) { M[x][y]^=1; rep(i,0,1) { int x=(A[l]+i-1)%n+1; int y=(B[l]+i-1)%n+1; if(x>y) swap(x,y); int id=I[x][y]; P[id]++; if(M[x][y]) Add(1,1,m,l+1,T[id][P[id]]-1,mp(x,y)); } } else { lst=Find(x)==Find(y); putchar(lst+48); } } else { int mid=(l+r)>>1; Solve(p<<1,l,mid),Solve(p<<1|1,mid+1,r); } while(top>tmp) Back(); }
int main(){ n=rd(),m=rd(); rep(i,1,n) F[i]=i,S[i]=1; rep(i,1,m) { opt[i]=rd(),A[i]=rd(),B[i]=rd(); if(opt[i]==1) rep(lst,0,1) { int x=(A[i]+lst-1)%n+1; int y=(B[i]+lst-1)%n+1; if(x>y) swap(x,y); if(!I[x][y]) I[x][y]=++c; T[I[x][y]].pb(i); } } rep(i,1,c) T[i].pb(m+1); Solve(1,1,m); }
|