可撤销并查集与分治应用
cpp
void dfs(int l,int r){
if(l==r){
//update ans
return;
}
int mid=l+r>>1;
int ts=dsu.tot;
for(int i=l;i<=mid;i++)//add edge
dfs(mid+1,r);
dsu.back(ts);
for(int mid+1;i<=r;i++)//add edge
dfs(l,mid);
dsu.back(ts);
}