#include<cstdlib> #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> using namespace std; const int buffer=1<<13; char buff[buffer]; int cnt=0; //getInt() reads and returns one integer at a time int getInt() { int number = 0; while(buff[cnt] < '0' || '9' < buff[cnt]) if(++cnt >= buffer) fread(buff, buffer, 1, stdin), cnt = 0; while('0' <= buff[cnt] && buff[cnt] <= '9') { number = number * 10 + buff[cnt] - '0'; if(++cnt >= buffer) fread(buff, buffer, 1, stdin), cnt = 0; } return number; } const int MAX_N = 100005; int stX[MAX_N],stY[MAX_N],stRadX[MAX_N],stRadY[MAX_N],k; int tata[MAX_N],rang[MAX_N]; int oper,x,y,radX,radY; int i,n,m,pasi; inline int radacina(int x){ int aux,nod=x; while(x!=tata[x]) x=tata[x]; while(nod!=x){ aux=tata[nod]; tata[nod]=x; nod=aux; } return x; } inline void uneste(int x, int y){ if(rang[x]<rang[y]) tata[x]=y; else tata[y]=x; if(rang[x]==rang[y]) ++rang[x]; } int main(){ n=getInt(); m=getInt(); for(i=1;i<=n;i++){ tata[i]=i; rang[i]=0; } for(;m>0;--m){ oper=getInt(); if(oper==1){ x=getInt(); y=getInt(); radX=radacina(x); radY=radacina(y); ++k; stX[k]=x; stRadX[k]=radX; stY[k]=y; stRadY[k]=radY; uneste(radX,radY); } else if(oper==2){ pasi=getInt(); for(i=k;i>k-pasi;--i) { tata[stX[i]]=stRadX[i]; tata[stY[i]]=stRadY[i]; } k-=pasi; } else if(oper==3){ x=getInt(); y=getInt(); if(radacina(x)==radacina(y)) printf("1\n"); else printf("0\n"); } } return 0; }