组合数学!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f[100009];
ll num[100009];
int find(int x)
{
if(f[x]==x)
return f[x];
else
return f[x]=find(f[x]);
}
int cnt[2]={3,1};
ll cal(ll x){
while(x%2==0&&cnt[0]>0){
x/=2;
cnt[0]--;
}
while(x%3==0&&cnt[1]>0){
x/=3;
cnt[1]--;
}
return x;
}
int main()
{
ll n,m;
scanf("%lld%d",&n,&m);
ll ans=cal(n)*cal(n-1)*cal(n-2)*cal(n-3);
printf("%lld\n",ans);
ll sum=0;
for(int i=1;i<=n;i++)
{
f[i]=i;
num[i]=1;
}
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
int tx=find(x);
int ty=find(y);
if(tx==ty || ans==0)
{
printf("%lld\n",ans);
continue;
}
else
{
f[ty]=tx;
ll n1=num[tx];
ll n2=num[ty];
num[tx]+=num[ty];
sum-=(n1*(n1-1)/2)+(n2*(n2-1)/2);
ll fuck=(n-n1-n2)*(n-n1-n2-1)/2;
ans-=n1*n2*(fuck-sum);
sum+=(n1+n2)*(n1+n2-1)/2;
printf("%lld\n",ans);
}
}
return 0;
}