#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<set<int>> ine; //vertices
vector<set<int>> oute; //components
vector<vector<int>> comp;
vector<int> mycomp;
ll ans = 0;
ll func(int v)
{
ll k = ine[v].size();
ll szc = comp[v].size();
return k * szc + szc*(szc-1);
}
void mrg(int u,int v)
{
ans -= func(u);
ans -= func(v);
if(ine[u].size()+oute[u].size()+comp[u].size() > ine[v].size()+oute[v].size()+comp[v].size())
swap(u,v);
for(auto c:ine[u])
{
if(mycomp[c] != v)
{
ine[v].insert(c);
oute[mycomp[c]].erase(u);
oute[mycomp[c]].insert(v);
}
}
for(auto c:oute[u])
{
if(c != v)
oute[v].insert(c);
}
oute[v].erase(u);
for(auto c:comp[u])
{
ine[v].erase(c);
comp[v].push_back(c);
mycomp[c] = v;
}
//cout << ine[v].size() << ' ';
ine[u].clear();
comp[u].clear();
// cout << ine[v].size() << ' ';
ans += func(v);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin >> n >> m;
ine.resize(n);
oute.resize(n);
comp.resize(n);
mycomp.resize(n);
for(int j = 0;j < n;++j)
{
mycomp[j] = j;
comp[j].push_back(j);
}
for(int j = 0;j < m;++j)
{
int u,v;
cin >> u >> v;
int u2 = u-1;
u--;
v--;
u = mycomp[u];
v = mycomp[v];
ans -= func(v);
ine[v].insert(u2);
oute[u].insert(v);
ans += func(v);
if(oute[v].find(u) != oute[v].end())
{
mrg(u,v);
}
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... |