rt,有没有人解释下这一般是怎么了。
#include <bits/stdc++.h>
//#define int long long
#define Rg register
#define Ri Rg int
#define Il inline
#define vec vector
#define pb push_back
#define fi first
#define se second
#define IT iterator
using namespace std;
typedef double db;
typedef pair<int,int> pii;
const int N=2e5,Inf=1e9;
const db eps=1e-8;
int n,Q;
struct Seg{
int id=0,rt[N+5],ls[N*17+5],rs[N*17+5],a[N*17+5];
Il int build(int l,int r,bool sid){
int p=++id;
if(l^r){
int mid=(l+r)>>1;
ls[p]=build(l,mid,sid);
rs[p]=build(mid+1,r,sid);
}else a[p]=(sid?1:l);
return p;
}
Il int chg(int ps,int l,int r,int cp,int K){
int p=++id;
ls[p]=ls[cp];
rs[p]=rs[cp];
a[p]=K;
if(l^r){
int mid=(l+r)>>1;
if(ps<=mid)ls[p]=chg(ps,l,mid,ls[p],K);
else rs[p]=chg(ps,mid+1,r,rs[p],K);
}
return p;
}
Il int qry(int ps,int l,int r,int p){
if(l==r)return a[p];
int mid=(l+r)>>1;
return (ps<=mid?qry(ps,l,mid,ls[p]):qry(ps,mid+1,r,rs[p]));
}
}fa,de;
Il int find(int p,int t){
for(Ri fp=fa.qry(p,1,n,fa.rt[t]);fp^p;fp=fa.qry(p,1,n,fa.rt[t]))p=fp;
return p;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>Q;
fa.rt[0]=fa.build(1,n,0);
de.rt[0]=de.build(1,n,1);
for(Ri t=1;t<=Q;t++){
int op,a,b,x;
cin>>op;
if(op==2){
cin>>x;
fa.rt[t]=fa.rt[x];
de.rt[t]=de.rt[x];
}else{
cin>>a>>b;
if(op==1){
int fx=find(a,t-1),fy=find(b,t-1),dx=de.qry(fx,1,n,de.rt[t-1]),dy=de.qry(fy,1,n,de.rt[t-1]);
if(dx>dy){
swap(fx,fy);
swap(dx,dy);
}
fa.rt[t]=fa.chg(fx,1,n,fa.rt[t-1],fy);
de.rt[t]=(dx==dy?de.chg(fy,1,n,de.rt[t-1],dy+1):de.rt[t-1]);
}else{
fa.rt[t]=fa.rt[t-1];
de.rt[t]=de.rt[t-1];
cout<<(find(a,t)==find(b,t))<<'\n';//不是输出了吗 qwq
}
}
}
return 0;
}