#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector> usingnamespacestd; #define ll long long #define il inline il intread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+ch-'0'; ch=getchar(); } return x*f; } constint maxn=1000010; int sz[maxn<<1],fa[maxn<<1],dep[maxn<<1]; int id[maxn]; structoperation{ int flag,x,y; }opt[maxn]; int ans[maxn]; vector<int> G[maxn]; int n,m,read_k,tot; intfindfather(int x){ return (fa[x]==x)?x:findfather(fa[x]); } voidwork(int nowtime){ operation tmp=opt[nowtime]; int xx=tmp.x,yy=tmp.y; if (tmp.flag==4){ //whether belongs to the same tree if (id[xx]==-1||id[yy]==-1){ ans[nowtime]=0; }else{ int fx=findfather(id[xx]),fy=findfather(id[yy]); ans[nowtime]=(fx==fy); } } if (tmp.flag==5){ //query sum if (id[xx]==-1){ ans[nowtime]=0; }else{ ans[nowtime]=sz[findfather(id[xx])]; } } for (int i=0;i<G[nowtime].size();++i){ operation nxt=opt[G[nowtime][i]]; int nx=nxt.x,ny=nxt.y; if (nxt.flag==1){ //merge x's ancestor's whole tree to y's if (id[nx]==-1||id[ny]==-1){ work(G[nowtime][i]); continue; } int fnx=findfather(id[nx]),fny=findfather(id[ny]); if (fnx==fny){ work(G[nowtime][i]); continue; } if (dep[fnx]==dep[fny]){ fa[fny]=fnx; sz[fnx]+=sz[fny]; dep[fnx]++; work(G[nowtime][i]); fa[fny]=fny; sz[fnx]-=sz[fny]; dep[fnx]--; }else{ if (dep[fnx]<dep[fny]) swap(fnx,fny); fa[fny]=fnx; sz[fnx]+=sz[fny]; work(G[nowtime][i]); fa[fny]=fny; sz[fnx]-=sz[fny]; } continue; } if (nxt.flag==2){ //extermination int res=id[nx]; if (id[nx]==-1){ work(G[nowtime][i]); continue; } int ff=findfather(id[nx]); sz[ff]--; id[nx]=-1; work(G[nowtime][i]); id[nx]=res; sz[ff]++; continue; } if (nxt.flag==3){ //transfer only one if (id[nx]==-1||id[ny]==-1){ work(G[nowtime][i]); continue; } int ffx=findfather(id[nx]),ffy=findfather(id[ny]); if (ffx==ffy){ work(G[nowtime][i]); continue; } int res=id[nx]; id[nx]=++tot; sz[id[nx]]=1; sz[ffx]--; fa[id[nx]]=ffy; sz[ffy]++; work(G[nowtime][i]); sz[ffx]++; sz[ffy]--; id[nx]=res; continue; } work(G[nowtime][i]); } } intmain(){ n=read(); m=read(); tot=n; for (int i=1;i<=m;++i){ opt[i].flag=read(); read_k=read(); G[read_k].push_back(i); opt[i].x=read(); if (opt[i].flag==1||opt[i].flag==3||opt[i].flag==4) opt[i].y=read(); } for (int i=1;i<=n;++i){ fa[i]=i; sz[i]=1; id[i]=i; } work(0); for (int i=1;i<=m;++i){ if (opt[i].flag==4){ if (ans[i]) printf("Yes\n"); elseprintf("No\n"); } if (opt[i].flag==5){ printf("%d\n",ans[i]); } } return0; }