#include <bits/stdc++.h>
#define il inline
#define mid (l+r>>1)
using namespace std;
const int N=2e5+5;
int n,m,t;
struct tree
{
int rt[N],st[N],tot=0;
struct sgt{int ls,rs,val;}seg[N<<4];
il void build(int &k,int l,int r)
{
k=++tot;
if(l==r){seg[k].val=st[l];return;}
build(seg[k].ls,l,mid);build(seg[k].rs,mid+1,r);
}
il void clone(int &k,int kf,int l,int r,int x,int y)
{
k=++tot;seg[k].ls=seg[kf].ls;seg[k].rs=seg[kf].rs;
if(l==r){seg[k].val=y;return;}
if(x<=mid)clone(seg[k].ls,seg[kf].ls,l,mid,x,y);
else clone(seg[k].rs,seg[kf].rs,mid+1,r,x,y);
}
il int query(int rt,int l,int r,int x)
{
if(l==r)return seg[rt].val;
if(x<=mid)query(seg[rt].ls,l,mid,x);
else query(seg[rt].rs,mid+1,r,x);
}
}bin,siz;
il int find(int x)
{
while(bin.query(bin.rt[t],1,n,x)!=x)x=bin.query(bin.rt[t],1,n,x);
return x;
}
il void merge(int x,int y)
{
int a=find(x),b=find(y);
if(a==b)return;
int sizx=siz.query(siz.rt[t],1,n,a);
int sizy=siz.query(siz.rt[t],1,n,b);
if(sizx<=sizy)
{
bin.clone(bin.rt[t],bin.rt[t],1,n,a,b);
siz.clone(siz.rt[t],siz.rt[t],1,n,b,sizx+sizy);
}
else
{
bin.clone(bin.rt[t],bin.rt[t],1,n,b,a);
siz.clone(siz.rt[t],siz.rt[t],1,n,a,sizx+sizy);
}
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i)bin.st[i]=i;
bin.build(bin.rt[0],1,n);
for(int i=1;i<=n;++i)siz.st[i]=1;
siz.build(siz.rt[0],1,n);
for(t=1;t<=m;++t)
{
int op;cin>>op;
bin.rt[t]=bin.rt[t-1];
siz.rt[t]=siz.rt[t-1];
if(op==1)
{
int x,y;cin>>x>>y;
merge(x,y);
}
else if(op==2)
{
int x;cin>>x;
bin.rt[t]=bin.rt[x];
siz.rt[t]=siz.rt[x];
}
else
{
int x,y;cin>>x>>y;
if(find(x)==find(y))puts("1");
else puts("0");
}
}
return 0;
}
这份代码,不开 O2 AC,开 O2 全部 MLE
请问是什么问题???求助大佬。
(本代码在其他 OJ 也有同样的问题)