int par[MAX];
int rank[MAX]; // 树的高度
void init(int n) {
for (int i = 0; i < n; i++) {
par[i] = i;
rank[i] = 0;
}
}
int find(int x) {
int px = x, i;
while (px != par[px]) {
px = par[px];
}
//路径压缩
while (x != px) {
i = par[x];
par[x] = px;
x = i;
}
return px;
}
void union(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return;
if (rank[x] > rank[y]) par[y] = x;
else {
par[x] = y;
if (rank[x] == rank[y]) rank[y]++;
}
}