#include using namespace std; const int buffer=1<<13; char buff[buffer]; int cnt=0; int numar,num,sol[100005],x[100005],y[100005],tata[100005]; //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; } inline int boss(int nod) { while (nod!=tata[nod]) nod=tata[nod]; return nod; } int main() { int n = getInt(); int m=getInt(); for (int i=1;i<=n;i++) tata[i]=1; for (int i=1;i<=m;i++) { int tip=getInt(); if (tip==1) { x[++numar]=getInt(); y[numar]=getInt(); tata[x[numar]]=y[numar]; } if (tip==2) { int nr=getInt(); tata[x[numar-nr+1]]=x[numar-nr+1]; } else { int x=getInt(); int y=getInt(); if (boss(x)==boss(y)) sol[++num]=1; else num++; } } for (int i=1;i<=num;i++) printf("%d\n",sol[i]); }