好久没写主席树啦
虽然是可持久化并查集,但是直接用一个主席树维护一下father数组就好啦
居然1A好开心
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef long long LL;
inline int read()
{
int x=0;bool f=0;char c=getchar();
for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0;
for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
return f?-x:x;
}
const int N=20010,M=150000;
int n,m;
struct na
{
na *ch[2];
int val;
int getv(int x,int l,int r);
na* update(int x,int a,int l,int r);
}P[M],*sz=P,*nul,*tr[N],*now;
int na::getv(int x,int l,int r)
{
if (l==r) return this->val;
if (x<=(l+r>>1)) return this->ch[0]->getv(x,l,l+r>>1);
else return this->ch[1]->getv(x,(l+r>>1)+1,r);
}
inline na* newnode()
{
sz->ch[0]=sz->ch[1]=nul;
return sz++;
}
na* na::update(int x,int a,int l,int r)
{
na *rec=newnode();
if (l==r) {rec->val=a;return rec;}
if (x<=(l+r>>1)) rec->ch[1]=this->ch[1],rec->ch[0]=this->ch[0]->update(x,a,l,l+r>>1);
else rec->ch[0]=this->ch[0],rec->ch[1]=this->ch[1]->update(x,a,(l+r>>1)+1,r);
return rec;
}
na* build(int l,int r)
{
na *rec=newnode();
if (l==r) {rec->val=l;return rec;}
rec->ch[0]=build(l,l+r>>1);
rec->ch[1]=build((l+r>>1)+1,r);
return rec;
}
inline int find(int x)
{
for (int fx;fx=now->getv(x,1,n),fx!=x;x=fx);
return x;
}
int main()
{
nul=newnode();
n=read();m=read();
now=tr[0]=build(1,n);
for (int i=1,op,a,b;i<=m;i++)
{
op=read();a=read();
if (op==1)
{
b=read();
a=find(a);b=find(b);
if (a!=b) now=now->update(a,b,1,n);
}
else if (op==2)
now=tr[a];
else
{
b=read();
a=find(a);b=find(b);
printf("%d\n",(int)a==b);
}
tr[i]=now;
}
return 0;
}