class dsu
{
private:
vector<int> rank, parent, size;
public:
dsu(int n)
{
rank.resize(n + 1, 0);
parent.resize(n + 1, 0);
iota(parent.begin(), parent.end(), 0);
size.resize(n + 1, 0);
};
int findpar(int u)
{
if (u == parent[u])
return u;
else
return parent[u] = findpar(parent[u]);
}
void unionbysize(int u, int v)
{
int ulp_u = findpar(u);
int ulp_v = findpar(v);
if (ulp_u == ulp_v)
return;
if (size[ulp_u] < size[ulp_v])
{
parent[ulp_u] = ulp_v;
size[ulp_v] += size[ulp_u];
}
else
{
parent[ulp_v] = ulp_u;
size[ulp_u] += size[ulp_v];
}
}
};