#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
vector<int> parent, sz;
int find(int i) {
if(parent[i]==i) return i;
return parent[i]=find(parent[i]);
}
void merge(int i, int j) {
int p1=find(i);
int p2=find(j);
if(p1==p2) return;
if(sz[p1]<sz[p2]) {
parent[p1]=p2;
sz[p2]+=sz[p1];
} else {
parent[p2]=p1;
sz[p1]+=sz[p2];
}
}
int main() {
vector<vector<int>> allowedSwaps={{0,4},{4,2},{1,3},{1,4}};
int n=5; //hard-code for now
sz.resize(n,1);
parent.resize(n);
iota(begin(parent),end(parent),0);
cout<<"Parents before: \n";
for(auto e: parent)
cout<<e<<" ";
cout<<"\n";
for(vector<int>& currswap: allowedSwaps) {
merge(currswap[0],currswap[1]);
}
cout<<"Parents after: \n";
for(auto e: parent)
cout<<e<<" ";
cout<<"\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvcjxpbnQ+IHBhcmVudCwgc3o7CgppbnQgZmluZChpbnQgaSkgewogICAgaWYocGFyZW50W2ldPT1pKSByZXR1cm4gaTsKICAgIHJldHVybiBwYXJlbnRbaV09ZmluZChwYXJlbnRbaV0pOwp9Cgp2b2lkIG1lcmdlKGludCBpLCBpbnQgaikgewogICAgaW50IHAxPWZpbmQoaSk7CiAgICBpbnQgcDI9ZmluZChqKTsKICAgIAogICAgaWYocDE9PXAyKSByZXR1cm47CiAgICBpZihzeltwMV08c3pbcDJdKSB7CiAgICAgICAgcGFyZW50W3AxXT1wMjsKICAgICAgICBzeltwMl0rPXN6W3AxXTsKICAgIH0gZWxzZSB7CiAgICAgICAgcGFyZW50W3AyXT1wMTsKICAgICAgICBzeltwMV0rPXN6W3AyXTsKICAgIH0KfQoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8dmVjdG9yPGludD4+IGFsbG93ZWRTd2Fwcz17ezAsNH0sezQsMn0sezEsM30sezEsNH19OwoKICAgIGludCBuPTU7CS8vaGFyZC1jb2RlIGZvciBub3cKICAgIHN6LnJlc2l6ZShuLDEpOwogICAgcGFyZW50LnJlc2l6ZShuKTsKICAgIGlvdGEoYmVnaW4ocGFyZW50KSxlbmQocGFyZW50KSwwKTsKCgljb3V0PDwiUGFyZW50cyBiZWZvcmU6IFxuIjsKICAgIGZvcihhdXRvIGU6IHBhcmVudCkKICAgICAgICBjb3V0PDxlPDwiICI7CiAgICBjb3V0PDwiXG4iOwoKICAgIGZvcih2ZWN0b3I8aW50PiYgY3VycnN3YXA6IGFsbG93ZWRTd2FwcykgewogICAgICAgIG1lcmdlKGN1cnJzd2FwWzBdLGN1cnJzd2FwWzFdKTsKICAgIH0KICAgIAogICAgY291dDw8IlBhcmVudHMgYWZ0ZXI6IFxuIjsKICAgIGZvcihhdXRvIGU6IHBhcmVudCkKICAgICAgICBjb3V0PDxlPDwiICI7CiAgICBjb3V0PDwiXG4iOwoKCXJldHVybiAwOwp9