传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=3674
额……没啥好说的了……做法同上一题……
#include<stdio.h>
#include<algorithm>
#define N 200005
using namespace std;
struct tree{int f,s,lson,rson;}t[N<<6];
int n,m,c2,tot,fu,fv,aim,s1,s2,type,u,v,Rt[N],la;
bool flag;
void build(int &k,const int &l,const int &r)
{
k=++tot;
if (l==r){t[k]=(tree){l,1,0,0};return;}
int mid=l+r>>1;
build(t[k].lson,l,mid);
build(t[k].rson,mid+1,r);
}
int fa(const int &k,const int &l,const int &r)
{
if (l==r)
{
aim=t[k].f;
if (t[k].f==l) flag=1;
return t[k].s;
}
int mid=l+r>>1,rt;
while (!flag && l<=aim && aim<=r) rt=(aim<=mid)?fa(t[k].lson,l,mid):fa(t[k].rson,mid+1,r);
return rt;
}
void change(int &k,const int &l,const int &r)
{
if (!k) k=++tot;
if (l==r){t[k]=(tree){fu,c2,0,0};return;}
int mid=l+r>>1;
if (aim<=mid){change(t[k].lson,l,mid);return;}
change(t[k].rson,mid+1,r);
}
void link(const int &k,const int &lk,const int &l,const int &r)
{
if (l==r) return;
if (!t[k].lson) t[k].lson=t[lk].lson;
if (!t[k].rson) t[k].rson=t[lk].rson;
int mid=l+r>>1;
if (aim<=mid){link(t[k].lson,t[lk].lson,l,mid);return;}
link(t[k].rson,t[lk].rson,mid+1,r);
}
int main()
{
scanf("%d%d",&n,&m);
build(Rt[0],1,n);
for (int i=1;i<=m;i++)
{
scanf("%d",&type);
if (type==1)
{
scanf("%d%d",&u,&v);u^=la,v^=la;
flag=0,aim=u,s1=fa(Rt[i-1],1,n),fu=aim;
flag=0,aim=v,s2=fa(Rt[i-1],1,n),fv=aim;
if (fu!=fv)
{
if (s1<s2) swap(fu,fv);
c2=s1+s2,aim=fu,change(Rt[i],1,n);
c2=s2,aim=fv,change(Rt[i],1,n);
aim=fu,link(Rt[i],Rt[i-1],1,n);
aim=fv,link(Rt[i],Rt[i-1],1,n);
}
else Rt[i]=Rt[i-1];
}
if (type==2)
{
scanf("%d",&u);u^=la;
Rt[i]=Rt[u];
}
if (type==3)
{
scanf("%d%d",&u,&v);u^=la,v^=la;
Rt[i]=Rt[i-1];
flag=0,aim=u,s1=fa(Rt[i],1,n),fu=aim;
flag=0,aim=v,s2=fa(Rt[i],1,n),fv=aim;
printf("%d\n",la=(fu==fv?1:0));
}
}
}