import sys

input=sys.stdin.readline

sys.setrecursionlimit(10**9)



class UnionFind:

    def __init__(self,n):

        self.par=[i for i in range(n+1)] #親要素のノード番号を格納

        self.rank=[0]*(n+1) #木の高さを格納

    def find(self,x): #根を検索

        if self.par[x]==x: #par[x]==xの時そのノードは根

            return x

        else:

            self.par[x]=self.find(self.par[x]) #親を書き換える

            return self.par[x]

    def union(self,x,y): #木の併合

        x=self.find(x)

        y=self.find(y)

        if x==y:

            return

        if self.rank[x]<self.rank[y]: #木の高さを比較し、低い方を親とする

            self.par[x]=y #xの親がy

        else:

            self.par[y]=x

            if self.rank[x]==self.rank[y]: #木の高さが同じなら親とする方を1増やす

                self.rank[x]+=1

    def same_check(self,x,y): #同じ木に属するか判定

        return self.find(x)==self.find(y)



n,m=list(map(int,input().split()))

edges=[list(map(int,input().split())) for _ in range(m)]

ans=[n*(n-1)//2]

size=[1]*n #size[i]:iを根とするグループのサイズ

uf=UnionFind(n)

for i in range(m-1,0,-1):

    tmp=ans[-1]

    a,b=edges[i][0]-1,edges[i][1]-1

    if not uf.same_check(a,b):

        tmp-=size[uf.find(a)]*size[uf.find(b)]

        tmp_a,tmp_b=size[uf.find(a)],size[uf.find(b)]

        uf.union(a,b)

        size[uf.find(a)]=tmp_a+tmp_b

    else:

        uf.union(a,b)

    ans.append(tmp)

for i in range(1,m+1):

    print((ans[-i]))
import sys

input=sys.stdin.readline

sys.setrecursionlimit(10**9)



class UnionFind:

    def __init__(self,n):

        self.par=[i for i in range(n+1)]

        self.rank=[0]*(n+1)

        self.size=[1]*(n+1)

    def find(self,x):

        if self.par[x]==x:

            return x

        else:

            self.par[x]=self.find(self.par[x])

            return self.par[x]

    def union(self,x,y):

        px=self.find(x)

        py=self.find(y)

        if px!=py:

            if self.rank[px]==self.rank[py]:

                self.rank[px]+=1

            elif self.rank[px]<self.rank[py]:

                px,py=py,px

            self.par[py]=px

            self.size[px]+=self.size[py]

    def same_check(self,x,y):

        return self.find(x)==self.find(y)



n,m=list(map(int,input().split()))

edges=[list(map(int,input().split())) for _ in range(m)]

ans=[n*(n-1)//2]

uf=UnionFind(n)

for i in range(m-1,0,-1):

    tmp=ans[-1]

    a,b=edges[i][0]-1,edges[i][1]-1

    if not uf.same_check(a,b):

        tmp-=uf.size[uf.find(a)]*uf.size[uf.find(b)]

    uf.union(a,b)

    ans.append(tmp)

for i in range(1,m+1):

    print((ans[-i]))
import sys

input = sys.stdin.readline
sys.setrecursionlimit(10**9)


class UnionFind:
    def __init__(self, n):
        self.par = [i for i in range(n + 1)]  # 親要素のノード番号を格納
        self.rank = [0] * (n + 1)  # 木の高さを格納

    def find(self, x):  # 根を検索
        if self.par[x] == x:  # par[x]==xの時そのノードは根
            return x
        else:
            self.par[x] = self.find(self.par[x])  # 親を書き換える
            return self.par[x]

    def union(self, x, y):  # 木の併合
        x = self.find(x)
        y = self.find(y)
        if x == y:
            return
        if self.rank[x] < self.rank[y]:  # 木の高さを比較し、低い方を親とする
            self.par[x] = y  # xの親がy
        else:
            self.par[y] = x
            if self.rank[x] == self.rank[y]:  # 木の高さが同じなら親とする方を1増やす
                self.rank[x] += 1

    def same_check(self, x, y):  # 同じ木に属するか判定
        return self.find(x) == self.find(y)


n, m = list(map(int, input().split()))
edges = [list(map(int, input().split())) for _ in range(m)]
ans = [n * (n - 1) // 2]
size = [1] * n  # size[i]:iを根とするグループのサイズ
uf = UnionFind(n)
for i in range(m - 1, 0, -1):
    tmp = ans[-1]
    a, b = edges[i][0] - 1, edges[i][1] - 1
    if not uf.same_check(a, b):
        tmp -= size[uf.find(a)] * size[uf.find(b)]
        tmp_a, tmp_b = size[uf.find(a)], size[uf.find(b)]
        uf.union(a, b)
        size[uf.find(a)] = tmp_a + tmp_b
    else:
        uf.union(a, b)
    ans.append(tmp)
for i in range(1, m + 1):
    print((ans[-i]))

import sys

input = sys.stdin.readline
sys.setrecursionlimit(10**9)


class UnionFind:
    def __init__(self, n):
        self.par = [i for i in range(n + 1)]
        self.rank = [0] * (n + 1)
        self.size = [1] * (n + 1)

    def find(self, x):
        if self.par[x] == x:
            return x
        else:
            self.par[x] = self.find(self.par[x])
            return self.par[x]

    def union(self, x, y):
        px = self.find(x)
        py = self.find(y)
        if px != py:
            if self.rank[px] == self.rank[py]:
                self.rank[px] += 1
            elif self.rank[px] < self.rank[py]:
                px, py = py, px
            self.par[py] = px
            self.size[px] += self.size[py]

    def same_check(self, x, y):
        return self.find(x) == self.find(y)


n, m = list(map(int, input().split()))
edges = [list(map(int, input().split())) for _ in range(m)]
ans = [n * (n - 1) // 2]
uf = UnionFind(n)
for i in range(m - 1, 0, -1):
    tmp = ans[-1]
    a, b = edges[i][0] - 1, edges[i][1] - 1
    if not uf.same_check(a, b):
        tmp -= uf.size[uf.find(a)] * uf.size[uf.find(b)]
    uf.union(a, b)
    ans.append(tmp)
for i in range(1, m + 1):
    print((ans[-i]))

-        self.par = [i for i in range(n + 1)]  # 親要素のノード番号を格納 -        self.rank = [0] * (n + 1)  # 木の高さを格納 +        self.par = [i for i in range(n + 1)] +        self.rank = [0] * (n + 1) +        self.size = [1] * (n + 1) -    def find(self, x):  # 根を検索 -        if self.par[x] == x:  # par[x]==xの時そのノードは根 +    def find(self, x): +        if self.par[x] == x: -            self.par[x] = self.find(self.par[x])  # 親を書き換える +            self.par[x] = self.find(self.par[x]) -    def union(self, x, y):  # 木の併合 -        x = self.find(x) -        y = self.find(y) -        if x == y: -            return -        if self.rank[x] < self.rank[y]:  # 木の高さを比較し、低い方を親とする -            self.par[x] = y  # xの親がy -        else: -            self.par[y] = x -            if self.rank[x] == self.rank[y]:  # 木の高さが同じなら親とする方を1増やす -                self.rank[x] += 1 +    def union(self, x, y): +        px = self.find(x) +        py = self.find(y) +        if px != py: +            if self.rank[px] == self.rank[py]: +                self.rank[px] += 1 +            elif self.rank[px] < self.rank[py]: +                px, py = py, px +            self.par[py] = px +            self.size[px] += self.size[py] -    def same_check(self, x, y):  # 同じ木に属するか判定 +    def same_check(self, x, y): -size = [1] * n  # size[i]:iを根とするグループのサイズ -        tmp -= size[uf.find(a)] * size[uf.find(b)] -        tmp_a, tmp_b = size[uf.find(a)], size[uf.find(b)] -        uf.union(a, b) -        size[uf.find(a)] = tmp_a + tmp_b -    else: -        uf.union(a, b) +        tmp -= uf.size[uf.find(a)] * uf.size[uf.find(b)] +    uf.union(a, b)