vector<int> parent;
vector<int> rank;
// path compression code
int find(int i){
if(i == parent[i]) return i;
return parent[i] = find(parent[i]);
}
// optimised Union fn
void Union(int x, int y){
int x_parent = find(x);
int y_parent = find(y);
if(x_parent == y_parent){
return;
}else if(rank[x_parent] > rank[y_parent]){
parent[y_parent] = x_parent;
}else if(rank[y_parent] > rank[x_parent]){
parent[x_parent] = y_parent;
}else{
parent[x_parent] = y_parent;
rank[y_parent]++;
}
}