class UnionFind():

    # コンストラクタ

    def __init__(self, n):

        # 要素数

        self.n = n

        # parents[i]: 要素iの親要素の番号

        # 要素iが根の場合、parents[i] = -(そのグループの要素数)

        self.parents = [-1] * n



    # 要素xが属するグループの根を返す

    # 経路圧縮

    def find(self, x):

        if self.parents[x] < 0:

            return x

        else:

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

            return self.parents[x]



    # 要素xが属するグループと要素yが属するグループとを併合する

    def union(self, x, y):

        x = self.find(x)

        y = self.find(y)



        if x == y:

            return



        if self.parents[x] > self.parents[y]:

            x, y = y, x



        self.parents[x] += self.parents[y]

        self.parents[y] = x



    # 要素xが属するグループの要素数を返す

    def size(self, x):

        return -self.parents[self.find(x)]



    # 要素x,yが同じグループに属するかどうかを返す

    def same(self, x, y):

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



    # 要素xが属するグループに属する要素をリストで返す

    def members(self, x):

        root = self.find(x)

        return [i for i in range(self.n) if self.find(i) == root]



    # 全ての根の要素をリストで返す

    def roots(self):

        return [i for i, x in enumerate(self.parents) if x < 0]



    # グループの数を返す

    def group_count(self):

        return len(self.roots())



    # 辞書{根の要素: [そのグループに含まれる要素のリスト], ...}を返す

    def all_group_members(self):

        return {r: self.members(r) for r in self.roots()}



    # print()での表示用

    # all_group_members()をprintする

    def __str__(self):

        return '\n'.join('{}: {}'.format(r, self.members(r)) for r in self.roots())



N,M = list(map(int,input().split()))

AB = [[int(i) for i in input().split()] for _ in range(M)]



uf = UnionFind(N)



from collections import deque



answer = deque([N*(N-1)//2])

for A,B in AB[::-1]:

    A -= 1

    B -= 1

    if uf.same(A,B):

        answer.appendleft(answer[0])

    else:

        answer.appendleft(answer[0] - uf.size(A) * uf.size(B))

        uf.union(A,B)



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

    print((answer[i]))
class UnionFind():

    # コンストラクタ

    def __init__(self, n):

        # 要素数

        self.n = n

        # parents[i]: 要素iの親要素の番号

        # 要素iが根の場合、parents[i] = -(そのグループの要素数)

        self.parents = [-1] * n



    # 要素xが属するグループの根を返す

    # 経路圧縮

    def find(self, x):

        if self.parents[x] < 0:

            return x

        else:

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

            return self.parents[x]



    # 要素xが属するグループと要素yが属するグループとを併合する

    def union(self, x, y):

        x = self.find(x)

        y = self.find(y)



        if x == y:

            return



        if self.parents[x] > self.parents[y]:

            x, y = y, x



        self.parents[x] += self.parents[y]

        self.parents[y] = x



    # 要素xが属するグループの要素数を返す

    def size(self, x):

        return -self.parents[self.find(x)]



    # 要素x,yが同じグループに属するかどうかを返す

    def same(self, x, y):

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



N,M = map(int,input().split())

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



UF = UnionFind(N)



from collections import deque



ans = deque([N*(N-1)//2])

for A,B in AB[::-1]:

    if UF.same(A,B):

        ans.appendleft(ans[0])

    else:

        ans.appendleft(ans[0] - UF.size(A) * UF.size(B))

        UF.union(A,B)



# 崩壊する前の情報はいらない

ans.popleft()



print(*ans, sep="\n")

class UnionFind:
    # コンストラクタ
    def __init__(self, n):
        # 要素数
        self.n = n
        # parents[i]: 要素iの親要素の番号
        # 要素iが根の場合、parents[i] = -(そのグループの要素数)
        self.parents = [-1] * n

    # 要素xが属するグループの根を返す
    # 経路圧縮
    def find(self, x):
        if self.parents[x] < 0:
            return x
        else:
            self.parents[x] = self.find(self.parents[x])
            return self.parents[x]

    # 要素xが属するグループと要素yが属するグループとを併合する
    def union(self, x, y):
        x = self.find(x)
        y = self.find(y)
        if x == y:
            return
        if self.parents[x] > self.parents[y]:
            x, y = y, x
        self.parents[x] += self.parents[y]
        self.parents[y] = x

    # 要素xが属するグループの要素数を返す
    def size(self, x):
        return -self.parents[self.find(x)]

    # 要素x,yが同じグループに属するかどうかを返す
    def same(self, x, y):
        return self.find(x) == self.find(y)

    # 要素xが属するグループに属する要素をリストで返す
    def members(self, x):
        root = self.find(x)
        return [i for i in range(self.n) if self.find(i) == root]

    # 全ての根の要素をリストで返す
    def roots(self):
        return [i for i, x in enumerate(self.parents) if x < 0]

    # グループの数を返す
    def group_count(self):
        return len(self.roots())

    # 辞書{根の要素: [そのグループに含まれる要素のリスト], ...}を返す
    def all_group_members(self):
        return {r: self.members(r) for r in self.roots()}

    # print()での表示用
    # all_group_members()をprintする
    def __str__(self):
        return "\n".join("{}: {}".format(r, self.members(r)) for r in self.roots())


N, M = list(map(int, input().split()))
AB = [[int(i) for i in input().split()] for _ in range(M)]
uf = UnionFind(N)
from collections import deque

answer = deque([N * (N - 1) // 2])
for A, B in AB[::-1]:
    A -= 1
    B -= 1
    if uf.same(A, B):
        answer.appendleft(answer[0])
    else:
        answer.appendleft(answer[0] - uf.size(A) * uf.size(B))
        uf.union(A, B)
for i in range(1, M + 1):
    print((answer[i]))

class UnionFind:
    # コンストラクタ
    def __init__(self, n):
        # 要素数
        self.n = n
        # parents[i]: 要素iの親要素の番号
        # 要素iが根の場合、parents[i] = -(そのグループの要素数)
        self.parents = [-1] * n

    # 要素xが属するグループの根を返す
    # 経路圧縮
    def find(self, x):
        if self.parents[x] < 0:
            return x
        else:
            self.parents[x] = self.find(self.parents[x])
            return self.parents[x]

    # 要素xが属するグループと要素yが属するグループとを併合する
    def union(self, x, y):
        x = self.find(x)
        y = self.find(y)
        if x == y:
            return
        if self.parents[x] > self.parents[y]:
            x, y = y, x
        self.parents[x] += self.parents[y]
        self.parents[y] = x

    # 要素xが属するグループの要素数を返す
    def size(self, x):
        return -self.parents[self.find(x)]

    # 要素x,yが同じグループに属するかどうかを返す
    def same(self, x, y):
        return self.find(x) == self.find(y)


N, M = map(int, input().split())
AB = [[int(i) - 1 for i in input().split()] for _ in range(M)]
UF = UnionFind(N)
from collections import deque

ans = deque([N * (N - 1) // 2])
for A, B in AB[::-1]:
    if UF.same(A, B):
        ans.appendleft(ans[0])
    else:
        ans.appendleft(ans[0] - UF.size(A) * UF.size(B))
        UF.union(A, B)
# 崩壊する前の情報はいらない
ans.popleft()
print(*ans, sep="\n")

-    # 要素xが属するグループに属する要素をリストで返す -    def members(self, x): -        root = self.find(x) -        return [i for i in range(self.n) if self.find(i) == root] -    # 全ての根の要素をリストで返す -    def roots(self): -        return [i for i, x in enumerate(self.parents) if x < 0] - -    # グループの数を返す -    def group_count(self): -        return len(self.roots()) - -    # 辞書{根の要素: [そのグループに含まれる要素のリスト], ...}を返す -    def all_group_members(self): -        return {r: self.members(r) for r in self.roots()} - -    # print()での表示用 -    # all_group_members()をprintする -    def __str__(self): -        return "\n".join("{}: {}".format(r, self.members(r)) for r in self.roots()) - - -N, M = list(map(int, input().split())) -AB = [[int(i) for i in input().split()] for _ in range(M)] -uf = UnionFind(N) +N, M = map(int, input().split()) +AB = [[int(i) - 1 for i in input().split()] for _ in range(M)] +UF = UnionFind(N) -answer = deque([N * (N - 1) // 2]) +ans = deque([N * (N - 1) // 2]) -    A -= 1 -    B -= 1 -    if uf.same(A, B): -        answer.appendleft(answer[0]) +    if UF.same(A, B): +        ans.appendleft(ans[0]) -        answer.appendleft(answer[0] - uf.size(A) * uf.size(B)) -        uf.union(A, B) -for i in range(1, M + 1): -    print((answer[i])) +        ans.appendleft(ans[0] - UF.size(A) * UF.size(B)) +        UF.union(A, B) +# 崩壊する前の情報はいらない +ans.popleft() +print(*ans, sep="\n")