DSU template

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];
        }
    }
};