by

Union-find

int find(vector<int>& parent, int k){
if(parent[k] == k)}{
return k;
}
return parent[k] = find(parent, parent[k]);
}

void find(vector<int>& parent, int p, int q){
int pA = find(parent, a);
int pB = find(parent, b);
if(pA == pB){
return;
}
if(pA > pB){
rank[pA] += rank[pB];
rank[pB] = 0;
parent[pB] = pA;
} else {
rank[pB] += rank[pA];
rank[pA] = 0;
parent[pA] = pB;
}

}

https://www.geeksforgeeks.org/union-by-rank-and-path-compression-in-union-find-algorithm/