class UnionFind:

    def __init__(self, size):

        self.parent = [-1]*size#非負なら親ノード，負ならグループの要素数



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

        if self.parent[x] < 0:

            return 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



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:

            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 = list(map(int, input().split()))

bridges = list(sys.stdin)

bridges.reverse()

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

uft = UnionFind(n)

for line in bridges[:-1]:

    a, b = list(map(int, line.split()))

    a -= 1

    b -= 1

    if uft.issame(a, b):

        buf.append(buf[-1])

        continue

    ra = uft.size(a)

    rb = uft.size(b)

    buf.append(buf[-1] - ra * rb)

    uft.merge(a, b)

buf.reverse()

print(('\n'.join(map(str, buf))))

    

    

    

    

    







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

    def root(self, x):  # root(x): xの根ノードを返す．
        if self.parent[x] < 0:
            return 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


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:
            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 = list(map(int, input().split()))
bridges = list(sys.stdin)
bridges.reverse()
buf = [n * (n - 1) // 2]
uft = UnionFind(n)
for line in bridges[:-1]:
    a, b = list(map(int, line.split()))
    a -= 1
    b -= 1
    if uft.issame(a, b):
        buf.append(buf[-1])
        continue
    ra = uft.size(a)
    rb = uft.size(b)
    buf.append(buf[-1] - ra * rb)
    uft.merge(a, b)
buf.reverse()
print(("\n".join(map(str, buf))))

+import sys + + -        self.parent = [-1] * size  # 非負なら親ノード，負ならグループの要素数 +        self.parent = [-1 for i in range(size)]  # 非負なら親ノード，負ならグループの要素数 -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])) +n, m = list(map(int, input().split())) +bridges = list(sys.stdin) +bridges.reverse() +buf = [n * (n - 1) // 2] +uft = UnionFind(n) +for line in bridges[:-1]: +    a, b = list(map(int, line.split())) +    a -= 1 +    b -= 1 +    if uft.issame(a, b): +        buf.append(buf[-1]) +        continue +    ra = uft.size(a) +    rb = uft.size(b) +    buf.append(buf[-1] - ra * rb) +    uft.merge(a, b) +buf.reverse() +print(("\n".join(map(str, buf))))