神秘 RE,本地测过了一个,但是交上去全部 RE。
#include<bits/stdc++.h>
using namespace std;
int n;
struct st{
int lson,rson;
int l,r;
int ans;
};
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
struct node{
st f[2500009];
//map<int,st> f;
int root[1000009];
int bb;
int inn;
inline void pushup(int t){
if(f[t].l!=f[t].r){
f[t].ans=f[f[t].lson].ans+f[f[t].rson].ans;
}
}
inline int build(int l,int r){
if(l==r){
//f[++inn].ans=read();
f[++inn].ans=l;
f[inn].l=l,f[inn].r=r;
return inn;
}
int z;
z=++inn;
f[inn].l=l,f[inn].r=r;
int mid;
mid=l+r;
mid>>=1;
f[z].lson=build(l,mid);
f[z].rson=build(mid+1,r);
pushup(z);
return z;
}
inline int answer(int t,int x){
if(f[t].l==1&&f[t].r==n){
root[++bb]=inn+1;
}
if(f[t].l==f[t].r){
f[++inn].l=f[t].l;
f[inn].r=f[t].r;
f[inn].ans=f[t].ans;
return f[t].ans;
}
int mid;
mid=f[t].l+f[t].r;
mid>>=1;
f[++inn].l=f[t].l;
f[inn].r=f[t].r;
int z;
z=inn;
int an;
if(x<=mid){
f[inn].rson=f[t].rson;
f[inn].lson=inn+1;
an=answer(f[t].lson,x);
}else{
f[inn].lson=f[t].lson;
f[inn].rson=inn+1;
an=answer(f[t].rson,x);
}
pushup(z);
return an;
}
inline int answ(int t,int x){
if(f[t].l==f[t].r){
return f[t].ans;
}
int mid;
mid=f[t].l+f[t].r;
mid>>=1;
int an;
if(x<=mid){
an=answ(f[t].lson,x);
}else{
an=answ(f[t].rson,x);
}
return an;
}
inline void change(int t,int x,int y){
if(f[t].l==1&&f[t].r==n){
root[++bb]=inn+1;
}
if(f[t].l==f[t].r){
f[++inn].l=f[t].l;
f[inn].r=f[t].r;
f[inn].ans=y;
return;
}
int mid;
mid=f[t].l+f[t].r;
mid>>=1;
f[++inn].l=f[t].l;
f[inn].r=f[t].r;
int z;
z=inn;
if(x<=mid){
f[inn].rson=f[t].rson;
f[inn].lson=inn+1;
change(f[t].lson,x,y);
}else{
f[inn].lson=f[t].lson;
f[inn].rson=inn+1;
change(f[t].rson,x,y);
}
pushup(z);
}
int getfa(int u,int x){
while(x!=answ(root[u],x)){
x=answ(root[u],x);
}
return x;
}
int merge(int u,int x,int y){
int s1,s2;
s1=s2=0;
while(x!=answ(root[u],x)){
x=answ(root[u],x);
s1++;
}
while(y!=answ(root[u],y)){
y=answ(root[u],y);
s2++;
}
if(s1>s2){
swap(x,y);
}
change(root[u],x,y);
}
}a;
int tim[1000009];
int inn;
int main(){
//freopen("sd.in","r",stdin);
//freopen("sd.out","w",stdout);
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int q;
//cin>>n>>q;
cin>>n>>q;
a.root[0]=a.build(1,n);
int u;
u=0;
for(int i=1;i<=q;i++){
int op;
cin>>op;
if(op==1){
int x,y;
cin>>x>>y;
a.merge(tim[i-1],x,y);
tim[i]=++inn;
}else if(op==2){
int x;
cin>>x;
tim[i]=tim[x];
}else{
int x,y;
cin>>x>>y;
cout<<(a.getfa(tim[i-1],x)==a.getfa(tim[i-1],y))<<endl;
tim[i]=tim[i-1];
}
}
return 0;
}