//并查集
class DSU {
public:
DSU(int n): parent(n) { //构造函数
for (int i = 0 ; i < n; ++i)
parent[i] = i;
}
void Union(int i, int j) { //将i所在的集合与j所在的集合合并
parent[Find(i)] = Find(j);
}
int Find(int i) { //找到i所在的集合
if (parent[i] != i) parent[i] = Find(parent[i]);
return parent[i];
}
private:
vector<int> parent;
};