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

运行 ID: 33882

//30 #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){ // cout<<" "<<m<<endl; return ++m;} // cout<<u<<" "<<lst<<" "<<ls<<" "<<edge[ls].db<<" "<<edge[edge[ls].db].nx<<endl; 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; q1.push(X),q2.push(Y); xx[++cntx]=X,yy[++cnty]=Y; while(!q1.empty()&&!q2.empty()){ int x=0,y=0; while(!q1.empty()){ for(inx(q1.front())){ h[q1.front()]=I; if(!w)continue; x=v; 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()]=I; if(!w)continue; y=v; 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=1; else fl=0; if(!fl)for(int i=1;i<=cntx;i++)ty[i]=k; else for(int i=1;i<=cnty;i++)ty[i]=k; for(int i=1;i<=cntx;i++)vis[i]=0; for(int i=1;i<=cnty;i++)vis[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]); } // cout<<endl; // for(int i=2;i<=CNT;i++)cout<<edge[i].w<<" "<<edge[i].v<<" "<<edge[i].db<<endl; // return; 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; // for(int i=2;i<=CNT;i++)cout<<edge[i].v<<" "<<edge[i].w<<endl; 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; // cout<<tmp.fr<<" "<<tmp.sc<<endl; 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; }