并查集 (DSU)

struct DSU {
    std::vector<int> f, sz;

    DSU(int n) : f(n), sz(n, 1) { std::iota(f.begin(), f.end(), 0); }

    int Find(int x) {
        while (x != f[x])
            x = f[x] = f[f[x]];
        return x;
    }

    void Merge(int x, int y) {
        x = Find(x), y = Find(y);
        if (x == y)
            return;
        f[y] = x;
        sz[x] += sz[y];
    }
};