像是主席树这种开大表的东西一定要放在全局,下面是
RE代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mid_A ((l+r)>>1)
#define Debug cerr<<"Passed line #"<<__LINE__<<" in function ["<<__FUNCTION__<<"].\n"
namespace mutable_dsu{
class dsu{
private:
#define MAXN_B 100010
int root[MAXN_B<<5];
struct node{
int lson,rson,fa,dep;
node(int v){
fa=v,dep=1;
lson=rson=0;
}
node(node &b){
lson=b.lson,rson=b.rson;
}
node(){
}
};
node tree[MAXN_B<<5];
int cnt=0,n;
int build(int l,int r){
cnt++;
if(l==r){tree[cnt]=node(l);return cnt;}
tree[cnt].lson=build(l,mid_A);
tree[cnt].rson=build(mid_A+1,r);
return cnt;
}
int merge(int last,int l,int r,int pos,int val){
cnt++;
tree[cnt]=node(tree[last]);
if(l==r){
tree[cnt].fa=val;
tree[cnt].dep=tree[last].dep;
return cnt;
}
if(pos<=mid_A)tree[cnt].lson=merge(tree[last].lson,l,mid_A,pos,val);
else tree[cnt].rson=merge(tree[last].rson,mid_A+1,r,pos,val);
}
void update(int now,int l,int r,int pos){
if(l==r){tree[now].dep++;return;}
if(pos<=mid_A)update(tree[now].lson,l,mid_A,pos);
else update(tree[now].rson,mid_A+1,r,pos);
}
int query(int now,int l,int r,int pos){
if(l==r)return now;
if(pos<=mid_A)return query(tree[now].lson,l,mid_A,pos);
else return query(tree[now].rson,mid_A+1,r,pos);
}
int find(int rt,int x){
int now=query(rt,1,n,x);
if(now==tree[now].fa){return now;}
return find(rt,tree[now].fa);
}
public:
void init(int n){
this->n=n;
root[0]=build(1,n);
}
void merge(int edition,int a,int b){
int faa=find(root[edition],a),fab=find(root[edition],b);
if(faa!=fab){
if(tree[faa].dep>tree[fab].dep)swap(faa,fab);
root[edition]=merge(root[edition-1],1,n,tree[faa].fa,tree[fab].fa);
if(tree[faa].dep==tree[fab].dep)update(root[edition],1,n,tree[fab].fa);
}
}
bool samepath(int edition,int a,int b){
return find(root[edition],a)==find(root[edition],b);
}
void undo_to_edi(int now,int past){
root[now]=root[past];
}
#undef MAXN_B
};
}
using namespace mutable_dsu;
int main(){
int n,m;
scanf("%d%d",&n,&m);
srand(time(NULL));
Debug;
dsu tree;
}