#include <bits/stdc++.h>
using namespace std;
class Dsu {
public:
Dsu(int n) : rank(n+1, 1), parent(n+1, 0) {
for (int i = 0; i < parent.size(); ++i) {
parent[i] = i;
}
}
void unionByRank(int a, int b) {
int parA = find(a);
int parB = find(b);
if (rank[parA] > rank[parB]) {
parent[parB] = parA;
rank[parA] += rank[parB];
} else {
parent[parA] = parB;
rank[parB] += rank[parA];
}
}
int find(int x) {
if (parent[x] == x) {
return x;
}
return parent[x] = find(parent[x]);
}
int numConnections(int x) { return rank[find(x)]; }
string areConnected(int x, int y) {
return find(x) == find(y) ? "Yes" : "No";
}
private:
vector<int> rank;
vector<int> parent;
};
int main() {
Dsu dsu(7);
dsu.unionByRank(1, 2);
dsu.unionByRank(3, 4);
dsu.unionByRank(5, 6);
dsu.unionByRank(2, 3);
cout << "People in group 1: " << dsu.numConnections(1) << endl;
cout << "People in group 5: " << dsu.numConnections(5) << endl;
cout << "People in group 7: " << dsu.numConnections(7) << endl;
cout << "Are 2 and 4 connected: " << dsu.areConnected(2, 4) << endl;
cout << "Are 7 and 4 connected: " << dsu.areConnected(4, 7) << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBEc3UgewoKcHVibGljOgogICAgRHN1KGludCBuKSA6IHJhbmsobisxLCAxKSwgcGFyZW50KG4rMSwgMCkgewogICAgCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyZW50LnNpemUoKTsgKytpKSB7CiAgICAJCXBhcmVudFtpXSA9IGk7CiAgICAJfQogICAgfQogICAgCiAgICB2b2lkIHVuaW9uQnlSYW5rKGludCBhLCBpbnQgYikgewogICAgCWludCBwYXJBID0gZmluZChhKTsKICAgIAlpbnQgcGFyQiA9IGZpbmQoYik7CiAgICAJCiAgICAJaWYgKHJhbmtbcGFyQV0gPiByYW5rW3BhckJdKSB7CiAgICAJCXBhcmVudFtwYXJCXSA9IHBhckE7CiAgICAJCXJhbmtbcGFyQV0gKz0gcmFua1twYXJCXTsKICAgIAl9IGVsc2UgewogICAgCQlwYXJlbnRbcGFyQV0gPSBwYXJCOwogICAgCQlyYW5rW3BhckJdICs9IHJhbmtbcGFyQV07CiAgICAJfQogICAgfQogICAgCiAgICBpbnQgZmluZChpbnQgeCkgewogICAgCWlmIChwYXJlbnRbeF0gPT0geCkgewogICAgCQlyZXR1cm4geDsKICAgIAl9CiAgICAJcmV0dXJuIHBhcmVudFt4XSA9IGZpbmQocGFyZW50W3hdKTsKICAgIH0KICAgIAogICAgaW50IG51bUNvbm5lY3Rpb25zKGludCB4KSB7IHJldHVybiByYW5rW2ZpbmQoeCldOyB9CiAgICAKICAgIHN0cmluZyBhcmVDb25uZWN0ZWQoaW50IHgsIGludCB5KSB7CiAgICAJcmV0dXJuIGZpbmQoeCkgPT0gZmluZCh5KSA/ICJZZXMiIDogIk5vIjsKICAgIH0KCnByaXZhdGU6CiAgICB2ZWN0b3I8aW50PiByYW5rOwogICAgdmVjdG9yPGludD4gcGFyZW50Owp9OwoKCmludCBtYWluKCkgewoJCglEc3UgZHN1KDcpOwoJZHN1LnVuaW9uQnlSYW5rKDEsIDIpOwoJZHN1LnVuaW9uQnlSYW5rKDMsIDQpOwoJZHN1LnVuaW9uQnlSYW5rKDUsIDYpOwoJZHN1LnVuaW9uQnlSYW5rKDIsIDMpOwoJCgkKCWNvdXQgPDwgIlBlb3BsZSBpbiBncm91cCAxOiAiIDw8IGRzdS5udW1Db25uZWN0aW9ucygxKSA8PCBlbmRsOwoJY291dCA8PCAiUGVvcGxlIGluIGdyb3VwIDU6ICIgPDwgZHN1Lm51bUNvbm5lY3Rpb25zKDUpIDw8IGVuZGw7Cgljb3V0IDw8ICJQZW9wbGUgaW4gZ3JvdXAgNzogIiA8PCBkc3UubnVtQ29ubmVjdGlvbnMoNykgPDwgZW5kbDsKCQoJY291dCA8PCAiQXJlIDIgYW5kIDQgY29ubmVjdGVkOiAiIDw8IGRzdS5hcmVDb25uZWN0ZWQoMiwgNCkgPDwgZW5kbDsKCWNvdXQgPDwgIkFyZSA3IGFuZCA0IGNvbm5lY3RlZDogIiA8PCBkc3UuYXJlQ29ubmVjdGVkKDQsIDcpIDw8IGVuZGw7CgkKCXJldHVybiAwOwp9