private static class UnionFind{
private int[] parent;
private int[] rank;
private int count;
public UnionFind(int n){
this.count = n;
parent = new int[n];
for(int i = 0; i < n; i++){
parent[i] = i;
}
rank = new int[n];
Arrays.fill(rank, 1);
}
public int size() {
return parent.length;
}
public boolean isConnected( int x , int y){
return find(x) == find(x);
}
public int count() {
return count;
}
public int find(int x){
return parent[x] == x ? x: (parent[x] = find(parent[x]));
}
public void unionSet(int x, int y){
int fx = find(x), fy = find(y);
if(fx == fy) {
return;
}
if(rank[x] < rank[y]){
int temp = fx;
fx = fy;
fy= temp;
}
rank[fx] += rank[fy];
parent[fy] = fx;
count--;
return ;
}
}