/*
并查集(DisjointSet)
*/
struct DisjointSet
{
const static int N=1e5+5;
int fa[N],sum[N];
int find(int x){
if(fa[x]==x) return x;
int root=find(fa[x]);
sum[x]+=sum[fa[x]]; //路径压缩过程中,组内元素个数的更新
return fa[x]=root;
}
void merge(int a,int b){//两组合并
int ffa=find(a),ffb=find(b);
if(ffa==ffb) return;
fa[ffb]=ffa;
sum[ffa]+=sum[ffb];
}
void init(int n){
for(int i=0;i<=n;i++){
fa[i]=i;
sum[i]=1;//初始化每个元素自己成为一组
}
}
};