// compile: make data // run: ./data < data.in #include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #ifdef LOCAL #include <debug/codeforces.h> #define debug(x...) _debug_print(#x, x); #define Debug(x...) _debug_print_format(#x, x); #else #define debug(x...) #define Debug(x...) #endif template<typename...Args> void print_(Args...args){((cout<<args<<" "),...)<<endl;} #define rep(i,a,b) for(int i=(a);i<(int)(b);++i) #define sz(v) ((int)(v).size()) #define print(...) print_(__VA_ARGS__); #define FIND(a, x) ((find(a.begin(),a.end(),(x))!=a.end())?1:0) #define cmin(x,...) x=min({(x), __VA_ARGS__}) #define cmax(x,...) x=max({(x), __VA_ARGS__}) #define INTMAX (int)(9223372036854775807) #define INF (int)(1152921504606846976) #define double long double #define int long long #define MAXN 200010 struct DSU { vector<int> parent, rank, s; DSU(int n) { parent.resize(n); rank.resize(n); s.resize(n, 1); rep(i, 0, n) parent[i] = i; } int find(int x) { if (parent[x] != x) parent[x] = find(parent[x]); return parent[x]; } void unite(int x, int y) { int rx = find(x), ry = find(y); if (rx == ry) return; if (rank[rx] < rank[ry]) parent[rx] = ry, s[ry] = s[rx] + s[ry]; else if (rank[rx] > rank[ry]) parent[ry] = rx, s[rx] = s[rx] + s[ry]; else parent[ry] = rx, ++rank[rx], s[rx] = s[rx] + s[ry]; } int get_size(int x) { return s[find(x)]; } }; int32_t main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, q; cin >> n >> q; DSU dsu(n); int total = n, maxsize = 1; while (q--) { int u, v; cin >> u >> v; --u, --v; if (dsu.find(u) != dsu.find(v)) { dsu.unite(u, v); --total, cmax(maxsize, dsu.get_size(u)); } cout << total << " " << maxsize << endl; } return 0; }
No Comments