给大家看一下这个非常离谱的测试点状态的形状
#include<bits/stdc++.h>
using namespace std;constexpr unsigned N=2e5+1;
#define cit const register unsigned
#define void inline void
#define int register unsigned
unsigned n;
class A{private:unsigned a[N<<6],rt[N],s[N<<6][2],x,y,id;
#define ls(o) s[o][0]
#define rs(o) s[o][1]
void dpdate(int&o,cit p,cit l,cit r){o=++id;ls(o)=ls(p),rs(o)=rs(p);if(l==r){a[o]=y;return;}
cit m=l+r>>1;if(x<=m)dpdate(ls(o),ls(p),l,m);else dpdate(rs(o),rs(p),m+1,r);}
inline unsigned qry(cit&o,cit l,cit r){cit m=l+r>>1;return l==r?a[o]:x<=m?qry(ls(o),l,m):qry(rs(o),m+1,r);}
void bd_fa(int&o,cit l,cit r){o=++id;if(l==r){a[o]=l;return;}cit m=l+r>>1;bd_fa(ls(o),l,m);bd_fa(rs(o),m+1,r);}
void bddep(int&o,cit l,cit r){o=++id;if(l==r){a[o]=1;return;}cit m=l+r>>1;bddep(ls(o),l,m);bddep(rs(o),m+1,r);}
public:
void build(const register bool f){f?bd_fa(rt[0],1,n):bddep(rt[0],1,n);}
inline unsigned operator()(cit i,cit j){x=j;return qry(rt[i],1,n);}
void dpdate(cit v,cit x1,cit x2){x=x1,y=x2;dpdate(rt[v],rt[v-1],1,n);}
void back(cit v1,cit v2){rt[v2]=rt[v1];}
}f,d;void back(cit v1,cit v2){f.back(v1,v2);d.back(v1,v2);}
inline unsigned fd(cit x,cit v){return f(v,x)==x?x:f(v,f(v,x));}
void me(int x,int y,cit v){x=fd(x,v),y=fd(y,v);if(x==y)return;cit dx=d(v,x),dy=d(v,y);
if(dx>dy)f.dpdate(v+1,y,x);else if(dx<dy)f.dpdate(v+1,x,y);
else f.dpdate(v+1,x,y),d.dpdate(v+1,y,dx+1);}
signed main(){ios::sync_with_stdio(0);int m;cin>>n>>m;f.build(1),d.build(0);
for(int i=1;i<=m;++i){int op,a,b;cin>>op>>a;if(op^2)cin>>b;
if(op==1)back(i-1,i),me(a,b,i-1);else if(op==2)back(a,i);
else back(i-1,i),cout<<(fd(a,i)==fd(b,i))<<'\n';
}
}