Disjoint set
static int parent[], rank[];
    
static int find(int u) {
    if (u == parent[u]) {
        return u;
    }
    return parent[u] = find(parent[u]);
}
static void merge(int u, int v) {
    u = find(u);
    v = find(v);
    
    if (u == v) {
        return;
    }
    // u - > v merging
    // tree depth 낮은게 높은 tree로 가야 tree depth가 변하지 않는다
    if (rank[u] > rank[v]) {
        // cording을 편하게 하기 위해
        //swap(u, v);
        
        int temp = u;
        u = v;
        v = temp;
    }
    parent[u] = v;
    if (rank[u] == rank[v]) {
        rank[v]++;
    }
}