class UF{
private:
vector<int> parent;
vector<int> sz;
int cnt;
public:
UF(int n):parent(n), sz(n), cnt(n){
for(int i = 0; i < n; i++)
{
parent[i] = i;
sz[i] = 1;
}
}
int find(int p){
while(p != parent[p]){
parent[p] = parent[parent[p]];
p = parent[p];
}
return p;
}
void unite(int p, int q){
int pRoot = find(p);
int qRoot = find(q);
if(pRoot == qRoot)
{
return;
}
if(sz[pRoot] <= sz[qRoot]){
parent[pRoot] = qRoot;
sz[qRoot] += sz[pRoot];
}else{
parent[qRoot] = pRoot;
sz[pRoot] += sz[qRoot];
}
cnt--;
return;
}
int getCount(){
return this->cnt;
}
};