Link to this code: https://cses.fi/paste/2b76467203921a1fbb2f23/
#include <iostream>
#include <vector>
#include <stack>
using namespace std;

class DSU {
private:
    vector<int>parent, rank, sz;
    int comp = 0, maxi = 0;
public:
    DSU(int n) {
        parent.resize(n + 1);
        rank.resize(n + 1);
        sz.assign(n + 1, 1);
        comp = n;
        maxi = 1;
        for (int i = 0; i <= n; i++) parent[i] = i;
    }

    int find_root(int node) {
        if (node == parent[node]) return node;
        return parent[node] = find_root(parent[node]);
    }

    int union_by_rank(int u, int v) {
        int root_u = find_root(u), root_v = find_root(v);
        if (root_u == root_v) return comp;
        comp--;
        if (rank[root_u] > rank[root_v]) {
            parent[root_v] = root_u;
        }
        else {
            parent[root_u] = root_v;
            if (rank[root_u] == rank[root_v]) {
                rank[root_v]++;
            }
        }
        return comp;
    }

    int union_by_size(int u, int v) {
        int root_u = find_root(u), root_v = find_root(v);
        if (root_u == root_v) return comp;
        comp--;
        if (sz[root_u] < sz[root_v]) {
            parent[root_u] = root_v;
            sz[root_v] += sz[root_u];
        }
        else {
            parent[root_v] = root_u;
            sz[root_u] += sz[root_v];
        }
        maxi = max({ maxi, sz[root_v], sz[root_u] });
        return comp;
    }

    int unite(int u, int v) {
        return union_by_size(u, v);
    }

    bool are_connected(int u, int v) {
        return find_root(u) == find_root(v);
    }

    int mx_comp() {
        int k = maxi;
        return maxi;
    }

};

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    /*freopen("closing.in", "r", stdin);
    freopen("closing.out", "w", stdout)*/;
    int n, m;
    cin >> n >> m;
    DSU d(n);
    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        int ans = d.union_by_size(a, b);
        cout << ans << " " << d.mx_comp() << "\n\n";
    }
}