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