删了按秩合并从76到了80
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int size[N],f[N],n,m,a[N],b[N],ans[N],opt[N];
vector<int>g[N];
int find(int x){
if(f[x]==x){
return x;
}
return find(f[x]);
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
size[fx]+=size[fy],size[fy]=0,f[fy]=fx;
}
void dfs(int u){
if(opt[u]==1){
if(find(a[u])!=find(b[u])){
if(size[find(a[u])]<size[find(b[u])]){
swap(a[u],b[u]);
}
int fx=find(a[u]),fy=find(b[u]),sizex=size[fx],sizey=size[fy];
merge(a[u],b[u]);
for(int v:g[u]){
dfs(v);
}
f[a[u]]=fx,f[b[u]]=fy,size[fx]=sizex,size[fy]=sizey;
}
else{
for(int v:g[u]){
dfs(v);
}
}
}
if(opt[u]==2){
for(int v:g[u]){
dfs(v);
}
}
if(opt[u]==3){
ans[u]=(find(a[u])==find(b[u]));
for(int v:g[u]){
dfs(v);
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
f[i]=i,size[i]=1;
}
for(int i=1;i<=m;i++){
cin>>opt[i]>>a[i];
if(opt[i]!=2){
cin>>b[i];
}
if(opt[i]==2){
g[a[i]].push_back(i);
}
else{
g[i-1].push_back(i);
}
}
opt[0]=2;
dfs(0);
for(int i=1;i<=m;i++){
if(opt[i]==3){
cout<<ans[i]<<'\n';
}
}
}