struct dsu {
vector<int> p;
dsu(int n) : p(n, -1) {}
int leader(int x) {
return p[x] < 0 ? x : p[x] = leader(p[x]);
}
int merge(int x, int y) {
int rx = leader(x);
int ry = leader(y);
if (rx == ry) return rx;
if (p[rx] < p[ry]) swap(rx, ry);
p[ry] += p[rx];
p[rx] = ry;
return ry;
}
int size(int x) {
return -p[leader(x)];
}
};