#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 1e5 + 10;
int pai[MAXN];
set<int> s[MAXN], comp[MAXN];
ll ans = 0;
int get(int v){
if(v == pai[v]) return v;
return pai[v] = get(pai[v]);
}
void dsu_union(int a, int b){
a = get(a);
b = get(b);
ll sz_a = (ll) comp[a].size();
ll sz_b = (ll) comp[b].size();
ans -= sz_a * ((ll) s[a].size() + sz_a - 1);
ans -= sz_b * ((ll) s[b].size() + sz_b - 1);
if(sz_a + (int) s[a].size() > sz_b + (int) s[b].size()) swap(a, b);
for(auto x : s[a]) if(!comp[b].count(x)) s[b].insert(x);
for(auto x : comp[a]){
comp[b].insert(x);
if(s[b].count(x)) s[b].erase(x);
}
sz_b = (ll) comp[b].size();
ans += sz_b * ((ll) s[b].size() + sz_b - 1);
pai[a] = b;
comp[a].clear();
s[a].clear();
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int n, m; cin >> n >> m;
for(int i=1; i<=n; i++){
pai[i] = i;
comp[i] = {i};
}
while(m--){
int a, b; cin >> a >> b;
if(get(a) == get(b)){
cout << ans << "\n";
continue;
}
if(s[get(a)].count(b)){
dsu_union(a, b);
} else if(!s[get(b)].count(a)){
ans += (int) comp[get(b)].size();
s[get(b)].insert(a);
}
cout << ans << "\n";
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |