#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
#pragma GCC optimize("O3,unroll-loops")
const int maxn=1e5;
int n,m;
set<int>adj[maxn+2],rev[maxn+2],cc[maxn+2];
int dsu[maxn+2],sz[maxn+2];
int fin(int a){
if(dsu[a]==a)return a;
return dsu[a]=fin(dsu[a]);
}
queue<ii>qu;
void cek(int a,int b){
adj[a].insert(b);
rev[b].insert(a);
if(adj[b].count(a))qu.push({a,b});
}
int ans=0;
void merg(int a,int b){
a=fin(a),b=fin(b);
if(a==b)return;
int tota=cc[a].size()+adj[a].size()+rev[a].size();
int totb=cc[b].size()+adj[b].size()+rev[b].size();
if(tota>totb)swap(a,b);
ans+=sz[a]*cc[b].size()+sz[b]*cc[a].size();
dsu[a]=b,sz[b]+=sz[a];
for(auto x : cc[a]){
if(cc[b].count(x))ans-=sz[b];
else cc[b].insert(x);
}
adj[a].erase(b), adj[b].erase(a);
rev[a].erase(b), rev[b].erase(a);
for(auto x : adj[a]){
rev[x].erase(a);
cek(b,x);
}
for(auto x : rev[a]){
//if(a==2)cout<<x<<endl;
adj[x].erase(a);
cek(x,b);
}
adj[a].clear(),rev[a].clear();
}
signed main(){
cin>>n>>m;
for(int q=1;q<=n;q++){
dsu[q]=q,sz[q]=1;
cc[q].insert(q);
}
while(m--){
int a,b;cin>>a>>b;
if(fin(a)!=fin(b) && !cc[fin(b)].count(a)){
int apa=fin(b);
cc[apa].insert(a);
ans+=sz[apa];
cek(fin(a),apa);
// if(a==2 && b==1)cout<<fin(a)<<' '<<apa<<endl;
while(qu.size()){
auto [u,v]=qu.front();
merg(fin(u),fin(v));
qu.pop();
}
}
cout<<ans<<endl;
}
}