#include <cstdio>
#include <stdio.h>
#include <stdbool.h>
#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <cmath>
#include <cctype>
#include <bitset>
#include <iomanip>
#include <cstring>
#include <numeric>
#include <cassert>
#include <random>
using namespace std;
#define int long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
int ans=0;
queue<pii> ord;
vector<int> dsu, sz;
vector<set<int> > graph, tgraph, child;
int fp(int a){
if (dsu[a]==-1)return a;
return dsu[a]=fp(dsu[a]);
}
void insert(int a, int b){
graph[a].insert(b);
tgraph[b].insert(a);
if (graph[b].find(a)!=graph[b].end())ord.push(mp(a, b));
}
void merge(int a, int b){
a=fp(a), b=fp(b);
if (a==b)return;
if (sz[a]+graph[a].size()+child[a].size()>sz[b]+graph[b].size()+child[b].size())swap(a, b);
ans+=sz[a]*child[b].size()+sz[b]*child[a].size();
sz[b]+=sz[a];
dsu[a]=b;
for (auto c:child[a]){
if (child[b].find(c)==child[b].end())child[b].insert(c);
else ans-=sz[b];
}
graph[a].erase(b);
tgraph[b].erase(a);
graph[b].erase(a);
tgraph[a].erase(b);
for (auto c:graph[a])tgraph[c].erase(a), insert(b, c);
for (auto c:tgraph[a])graph[c].erase(a), insert(c, b);
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, q, a, b;
cin>>n>>q;
graph.resize(n+1);
tgraph.resize(n+1);
dsu.resize(n+1, -1);
sz.resize(n+1, 1);
child.resize(n+1);
for (int i=1; i<=n; ++i)child[i].insert(i);
while (q--){
cin>>a>>b;
b=fp(b);
if (fp(a)!=b&&child[b].find(a)==child[b].end()){
child[b].insert(a);
ans+=sz[b];
a=fp(a);
insert(a, b);
while (ord.size())merge(ord.front().fi, ord.front().se), ord.pop();
}
cout<<ans<<"\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |