class UnionFind:

    def __init__(self, size):

        self.parent = [-1 for i in range(size)]#非負なら親ノード，負ならグループの要素数



    def root(self, x): #root(x): xの根ノードを返す．

        if self.parent[x] < 0:

            return x

        else:

            while self.parent[x] >= 0 and self.parent[self.parent[x]] >= 0:

                self.parent[x] = self.parent[self.parent[x]]

                x = self.parent[x]

#        self.parent[x] = self.root(self.parent[x]) #xをxの根に直接つなぐ

            return (x if self.parent[x] < 0 else self.parent[x])



    def merge(self, x, y): #merge(x,y): xのいるグループと$y$のいるグループをまとめる

        x = self.root(x)

        y = self.root(y)

        if x == y:

            return False

        if self.parent[x] > self.parent[y]: #xの要素数がyの要素数より「小さい」とき入れ替える

            x,y=y,x

        self.parent[x] += self.parent[y] #xの要素数を更新

        self.parent[y] = x #yをxにつなぐ

        return True



    def issame(self, x, y): #same(x,y): xとyが同じグループにあるならTrue

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

        

    def size(self,x): #size(x): xのいるグループの要素数を返す

        return -self.parent[self.root(x)]





n,m=[int(i) for i in input().split()]



A=[[int(i)-1 for i in input().split()] for _ in range(m)]



ans = [0]*(m+1)

a = n*(n-1)//2

ans[0] = a



uf = UnionFind(n)

for i in range(m):

    j = m-i-1

    v1 = A[j][0]

    v2 = A[j][1]

#    print(v1,v2)

    if not uf.issame(v1,v2):

#        print(uf.parent)

        a -= uf.size(v1) * uf.size(v2)

        uf.merge(v1,v2)



    ans[i+1]=a



for i in range(m):

    print((ans[m-i-1]))

    

    

    

    

    

    







import sys

input = sys.stdin.readline



class UnionFind:

    def __init__(self, size):

        self.parent = [-1 for i in range(size)]#非負なら親ノード，負ならグループの要素数



    def root(self, x): #root(x): xの根ノードを返す．

        if self.parent[x] < 0:

            return x

        elif self.parent[self.parent[x]] < 0:

            return self.parent[x]

        else:

            self.parent[x] = self.root(self.parent[x]) #xをxの根に直接つなぐ

            return self.parent[x]



    def merge(self, x, y): #merge(x,y): xのいるグループと$y$のいるグループをまとめる

        x = self.root(x)

        y = self.root(y)

        if x == y:

            return False

        if self.parent[x] > self.parent[y]: #xの要素数がyの要素数より「小さい」とき入れ替える

            x,y=y,x

        self.parent[x] += self.parent[y] #xの要素数を更新

        self.parent[y] = x #yをxにつなぐ

        return True



    def issame(self, x, y): #same(x,y): xとyが同じグループにあるならTrue

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

        

    def size(self,x): #size(x): xのいるグループの要素数を返す

        return -self.parent[self.root(x)]





n,m=[int(i) for i in input().split()]



A=[[int(i)-1 for i in input().split()] for _ in range(m)]



ans = [0]*(m+1)

a = n*(n-1)//2

ans[0] = a



uf = UnionFind(n)

for i in range(m):

    j = m-i-1

    v1 = A[j][0]

    v2 = A[j][1]

#    print(v1,v2)

    if not uf.issame(v1,v2):

#        print(uf.parent)

        a -= uf.size(v1) * uf.size(v2)

        uf.merge(v1,v2)



    ans[i+1]=a



for i in range(m):

    print((ans[m-i-1]))

    

    

    

    

    

    







class UnionFind:
    def __init__(self, size):
        self.parent = [-1 for i in range(size)]  # 非負なら親ノード，負ならグループの要素数

    def root(self, x):  # root(x): xの根ノードを返す．
        if self.parent[x] < 0:
            return x
        else:
            while self.parent[x] >= 0 and self.parent[self.parent[x]] >= 0:
                self.parent[x] = self.parent[self.parent[x]]
                x = self.parent[x]
            #        self.parent[x] = self.root(self.parent[x]) #xをxの根に直接つなぐ
            return x if self.parent[x] < 0 else self.parent[x]

    def merge(self, x, y):  # merge(x,y): xのいるグループと$y$のいるグループをまとめる
        x = self.root(x)
        y = self.root(y)
        if x == y:
            return False
        if self.parent[x] > self.parent[y]:  # xの要素数がyの要素数より「小さい」とき入れ替える
            x, y = y, x
        self.parent[x] += self.parent[y]  # xの要素数を更新
        self.parent[y] = x  # yをxにつなぐ
        return True

    def issame(self, x, y):  # same(x,y): xとyが同じグループにあるならTrue
        return self.root(x) == self.root(y)

    def size(self, x):  # size(x): xのいるグループの要素数を返す
        return -self.parent[self.root(x)]


n, m = [int(i) for i in input().split()]
A = [[int(i) - 1 for i in input().split()] for _ in range(m)]
ans = [0] * (m + 1)
a = n * (n - 1) // 2
ans[0] = a
uf = UnionFind(n)
for i in range(m):
    j = m - i - 1
    v1 = A[j][0]
    v2 = A[j][1]
    #    print(v1,v2)
    if not uf.issame(v1, v2):
        #        print(uf.parent)
        a -= uf.size(v1) * uf.size(v2)
        uf.merge(v1, v2)
    ans[i + 1] = a
for i in range(m):
    print((ans[m - i - 1]))

import sys

input = sys.stdin.readline


class UnionFind:
    def __init__(self, size):
        self.parent = [-1 for i in range(size)]  # 非負なら親ノード，負ならグループの要素数

    def root(self, x):  # root(x): xの根ノードを返す．
        if self.parent[x] < 0:
            return x
        elif self.parent[self.parent[x]] < 0:
            return self.parent[x]
        else:
            self.parent[x] = self.root(self.parent[x])  # xをxの根に直接つなぐ
            return self.parent[x]

    def merge(self, x, y):  # merge(x,y): xのいるグループと$y$のいるグループをまとめる
        x = self.root(x)
        y = self.root(y)
        if x == y:
            return False
        if self.parent[x] > self.parent[y]:  # xの要素数がyの要素数より「小さい」とき入れ替える
            x, y = y, x
        self.parent[x] += self.parent[y]  # xの要素数を更新
        self.parent[y] = x  # yをxにつなぐ
        return True

    def issame(self, x, y):  # same(x,y): xとyが同じグループにあるならTrue
        return self.root(x) == self.root(y)

    def size(self, x):  # size(x): xのいるグループの要素数を返す
        return -self.parent[self.root(x)]


n, m = [int(i) for i in input().split()]
A = [[int(i) - 1 for i in input().split()] for _ in range(m)]
ans = [0] * (m + 1)
a = n * (n - 1) // 2
ans[0] = a
uf = UnionFind(n)
for i in range(m):
    j = m - i - 1
    v1 = A[j][0]
    v2 = A[j][1]
    #    print(v1,v2)
    if not uf.issame(v1, v2):
        #        print(uf.parent)
        a -= uf.size(v1) * uf.size(v2)
        uf.merge(v1, v2)
    ans[i + 1] = a
for i in range(m):
    print((ans[m - i - 1]))

+import sys + +input = sys.stdin.readline + + +        elif self.parent[self.parent[x]] < 0: +            return self.parent[x] -            while self.parent[x] >= 0 and self.parent[self.parent[x]] >= 0: -                self.parent[x] = self.parent[self.parent[x]] -                x = self.parent[x] -            #        self.parent[x] = self.root(self.parent[x]) #xをxの根に直接つなぐ -            return x if self.parent[x] < 0 else self.parent[x] +            self.parent[x] = self.root(self.parent[x])  # xをxの根に直接つなぐ +            return self.parent[x]