提交时间:2024-10-24 19:34:10

运行 ID: 33885

//100,没加强制在线 #include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define inx(u) int I=h[(u)],v=edge[I].v,w=edge[I].w;I;I=edge[I].nx,v=edge[I].v,w=edge[I].w int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=300010,B=400,K=250,N=100000,Mod=1000000007; map<pii,int>MP; struct Edge{int v,nx,w,db;}edge[MAXN<<1];int cut[MAXN],h[MAXN],CNT;void add_side(int u,int v){ edge[++CNT]={v,h[u]};cut[u]=h[u]=CNT; edge[MP[mk(v,u)]].db=CNT; edge[CNT].db=MP[mk(v,u)]; MP[mk(u,v)]=CNT; } int n,m,q,k,ans,fa[MAXN],d[MAXN]; int fid(int x){return fa[x]==x?x:fa[x]=fid(fa[x]);} bool mrge(pii p){ int u=fid(p.fr),v=fid(p.sc); if(u!=v){ fa[u]=v; return 0; } return 1; } int dfs(int u,int lst,int ls){ if(!ls)ls=h[u]; if(ls==lst){ return ++m;} if(lst==-1)lst=ls; return edge[ls].w=dfs(edge[ls].v,lst,edge[edge[ls].db].nx); } vector<int>G[MAXN]; map<pii,pair<pii,int> >mp; bool vis[MAXN]; int ty[MAXN],tp[MAXN],xx[MAXN],yy[MAXN],cntx,cnty,tot; queue<int>q1,q2; void split(int X,int Y){ bool fl=0; // cout<<X<<" "<<Y<<":"<<endl; q1.push(X),q2.push(Y); xx[++cntx]=X,yy[++cnty]=Y; vis[X]=vis[Y]=1; while(!q1.empty()&&!q2.empty()){ int x=0,y=0; // cout<<q1.front()<<" "<<q2.front()<<endl; while(!q1.empty()){ for(inx(q1.front())){ h[q1.front()]=edge[I].nx; if(!w)continue; x=v; // cout<<"Q1:"<<q1.front()<<" "<<x<<endl; break; } if(!x)h[q1.front()]=cut[q1.front()],q1.pop(); else break; } if(!x){ fl=0; break; } while(!q2.empty()){ for(inx(q2.front())){ h[q2.front()]=edge[I].nx; if(!w)continue; y=v; // cout<<"Q2:"<<q2.front()<<" "<<y<<endl; break; } if(!y)h[q2.front()]=cut[q2.front()],q2.pop(); else break; } if(!y){ fl=1; break; } if(!vis[x]){ vis[x]=1; xx[++cntx]=x; q1.push(x); } if(!vis[y]){ vis[y]=1; yy[++cnty]=y; q2.push(y); } } if(q1.empty())fl=0; else fl=1; if(!fl)for(int i=1;i<=cntx;i++)ty[xx[i]]=k;//,cout<<xx[i]<<":"<<k<<endl; else for(int i=1;i<=cnty;i++)ty[yy[i]]=k;//,cout<<yy[i]<<":"<<k<<endl; for(int i=1;i<=cntx;i++)vis[xx[i]]=0; for(int i=1;i<=cnty;i++)vis[xx[i]]=0; cntx=cnty=tot=0; while(!q1.empty())h[q1.front()]=cut[q1.front()],q1.pop(); while(!q2.empty())h[q2.front()]=cut[q2.front()],q2.pop(); } int ttmpp[MAXN]; void slv(){ CNT=1; n=read(),q=read(); for(int i=1;i<=n;i++){ int k=d[i]=read(); for(int j=1;j<=k;j++)ttmpp[j]=read(); for(int j=k;j>=1;j--)add_side(i,ttmpp[j]); } for(int i=1;i<=n;i++){ for(inx(i))if(!w){ dfs(i,-1,I); } } k=1; for(int i=1;i<=n;i++)ty[i]=1; for(int i=1;i<=m;i++)fa[i]=i; while(q--){ char c=getchar();while(c!='-'&&c!='?')c=getchar(); int x=read()^ans,y=read()^ans; if(c=='-'){ pii tmp=mk(edge[MP[mk(x,y)]].w,edge[MP[mk(y,x)]].w); edge[MP[mk(x,y)]].w=edge[MP[mk(y,x)]].w=0; if(mrge(tmp)){ k++; split(x,y); } printf("%lld\n",ans=k); } else{ printf("%lld\n",ans=ty[x]==ty[y]); } } } signed main(){ slv(); return 0; }