#include<bits/stdc++.h>
using namespace std;
const long long maxn=1e5+10;
struct{
int l,r,fa;
}tree[maxn*15];
int n,Q;
int visit = 1;
int tot;
int insert(int p,int l,int r,int x){
if(p == 0){
p = ++tot;
}
if(l == r){
tree[p].fa = l;
return p;
}
int ls = tree[p].l;
int rs = tree[p].r;
int mid = l+r >> 1;
if(x <= mid){
tree[p].l = insert(ls,l,mid,x);
}
else{
tree[p].r = insert(rs,mid+1,r,x);
}
return p;
}
int find(int p,int l,int r,int x){
if(p == 0) return 0;
if(l == r){
if(tree[p].fa == l){
return tree[p].fa;
}
else return tree[p].fa = find(visit,1,n,tree[p].fa);
}
int ls = tree[p].l;
int rs = tree[p].r;
int mid = l+r >> 1;
if(x <= mid) return find(ls,l,mid,x);
else return find(rs,mid+1,r,x);
}
int repair(int a,int b,int l,int r,int u,int v){
if(a == 0){
a = ++tot;
}
if(l == r){
tree[a].fa = v;
return a;
}
int ls = tree[a].l;
int rs = tree[a].r;
int lx = tree[b].l;
int rx = tree[b].r;
int mid = l+r >> 1;
if(u <= mid){
tree[a].l = repair(ls,lx,l,mid,u,v);
tree[a].r = rx;
}
else{
tree[a].l = ls;
tree[a].r = (rs,rx,mid+1,r,u,v);
}
return a;
}
signed main()
{
cin>>n>>Q;
tot = n+1;
for(int i=1;i<=n;i++){
insert(1,1,n,i);
}
for(int i=1;i<=Q;i++){
int op;
scanf("%d",&op);
if(op == 1){
int x,y;
scanf("%d %d",&x,&y);
int fa_x = find(visit,1,n,x);
int fa_y = find(visit,1,n,y);
repair(i+1,visit,1,n,fa_x,fa_y);
visit = i+1;
}
else if(op == 2){
int k;
scanf("%d",&k);
visit = k+1;
}
else if(op == 3){
int x,y;
scanf("%d %d",&x,&y);
int fa_x = find(visit,1,n,x);
int fa_y = find(visit,1,n,y);
repair(i+1,visit,1,n,fa_x,fa_x);
visit = i+1;
printf("%d\n",(fa_x == fa_y));
}
}
return 0;
}