class UnionFind:

    """素集合を木構造として管理する"""

    def __init__(self, n):

        self.parent = [-1] * n

        self.cnt = n



    def root(self, x):

        """頂点xの根を求める"""

        if self.parent[x] < 0:

            return x

        else:

            self.parent[x] = self.root(self.parent[x])

            return self.parent[x]

 

    def merge(self, x, y):

        """頂点xを含む集合と頂点y含む集合を結合する"""

        x = self.root(x)

        y = self.root(y)

        if x == y:

            return

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

            x, y = y, x

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

        self.parent[y] = x

        self.cnt -= 1



    def is_same(self, x, y):

        """頂点xと頂点yが同じ集合に属するかどうかを返す"""

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



    def get_size(self, x):

        """頂点xを含む集合の要素数を返す"""

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



    def get_cnt(self):

        """集合の個数を返す"""

        return self.cnt



    

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

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



uf = UnionFind(n)

ans = [0] * (m + 1)

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



for i in reversed(list(range(m))):

    x, y = info[i]

    x -= 1

    y -= 1

    if uf.is_same(x, y):

        ans[i] = ans[i + 1]

    else:

        ans[i] = ans[i + 1] - uf.get_size(x) * uf.get_size(y)

        uf.merge(x, y)



for res in ans[1:]:

    print(res)
class UnionFind:

    """素集合を木構造として管理する"""

    def __init__(self, n):

        self.parent = [-1] * n

        self.cnt = n



    def root(self, x):

        """頂点xの根を求める"""

        if self.parent[x] < 0:

            return x

        else:

            self.parent[x] = self.root(self.parent[x])

            return self.parent[x]

 

    def merge(self, x, y):

        """頂点xを含む集合と頂点y含む集合を結合する"""

        x = self.root(x)

        y = self.root(y)

        if x == y:

            return

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

            x, y = y, x

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

        self.parent[y] = x

        self.cnt -= 1



    def is_same(self, x, y):

        """頂点xと頂点yが同じ集合に属するかどうかを返す"""

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



    def get_size(self, x):

        """頂点xを含む集合の要素数を返す"""

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



    def get_cnt(self):

        """集合の個数を返す"""

        return self.cnt





import sys

input = sys.stdin.readline



    

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

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



uf = UnionFind(n)

ans = [0] * (m + 1)

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



for i in reversed(list(range(m))):

    x, y = info[i]

    x -= 1

    y -= 1

    if uf.is_same(x, y):

        ans[i] = ans[i + 1]

    else:

        ans[i] = ans[i + 1] - uf.get_size(x) * uf.get_size(y)

        uf.merge(x, y)



for res in ans[1:]:

    print(res)

class UnionFind:
    """素集合を木構造として管理する"""

    def __init__(self, n):
        self.parent = [-1] * n
        self.cnt = n

    def root(self, x):
        """頂点xの根を求める"""
        if self.parent[x] < 0:
            return x
        else:
            self.parent[x] = self.root(self.parent[x])
            return self.parent[x]

    def merge(self, x, y):
        """頂点xを含む集合と頂点y含む集合を結合する"""
        x = self.root(x)
        y = self.root(y)
        if x == y:
            return
        if self.parent[x] > self.parent[y]:
            x, y = y, x
        self.parent[x] += self.parent[y]
        self.parent[y] = x
        self.cnt -= 1

    def is_same(self, x, y):
        """頂点xと頂点yが同じ集合に属するかどうかを返す"""
        return self.root(x) == self.root(y)

    def get_size(self, x):
        """頂点xを含む集合の要素数を返す"""
        return -self.parent[self.root(x)]

    def get_cnt(self):
        """集合の個数を返す"""
        return self.cnt


n, m = list(map(int, input().split()))
info = [list(map(int, input().split())) for i in range(m)]
uf = UnionFind(n)
ans = [0] * (m + 1)
ans[-1] = n * (n - 1) // 2
for i in reversed(list(range(m))):
    x, y = info[i]
    x -= 1
    y -= 1
    if uf.is_same(x, y):
        ans[i] = ans[i + 1]
    else:
        ans[i] = ans[i + 1] - uf.get_size(x) * uf.get_size(y)
        uf.merge(x, y)
for res in ans[1:]:
    print(res)

class UnionFind:
    """素集合を木構造として管理する"""

    def __init__(self, n):
        self.parent = [-1] * n
        self.cnt = n

    def root(self, x):
        """頂点xの根を求める"""
        if self.parent[x] < 0:
            return x
        else:
            self.parent[x] = self.root(self.parent[x])
            return self.parent[x]

    def merge(self, x, y):
        """頂点xを含む集合と頂点y含む集合を結合する"""
        x = self.root(x)
        y = self.root(y)
        if x == y:
            return
        if self.parent[x] > self.parent[y]:
            x, y = y, x
        self.parent[x] += self.parent[y]
        self.parent[y] = x
        self.cnt -= 1

    def is_same(self, x, y):
        """頂点xと頂点yが同じ集合に属するかどうかを返す"""
        return self.root(x) == self.root(y)

    def get_size(self, x):
        """頂点xを含む集合の要素数を返す"""
        return -self.parent[self.root(x)]

    def get_cnt(self):
        """集合の個数を返す"""
        return self.cnt


import sys

input = sys.stdin.readline
n, m = list(map(int, input().split()))
info = [list(map(int, input().split())) for i in range(m)]
uf = UnionFind(n)
ans = [0] * (m + 1)
ans[-1] = n * (n - 1) // 2
for i in reversed(list(range(m))):
    x, y = info[i]
    x -= 1
    y -= 1
    if uf.is_same(x, y):
        ans[i] = ans[i + 1]
    else:
        ans[i] = ans[i + 1] - uf.get_size(x) * uf.get_size(y)
        uf.merge(x, y)
for res in ans[1:]:
    print(res)

+import sys + +input = sys.stdin.readline