Buggy python submission (verdict: Time Limit Exceeded):
import sys
input = sys.stdin.readline


class UnionFind():
    def __init__(self, n):
        self.n = n
        self.parents = [-1] * n

    def find(self, x):                                          # 根を見つける関数を定義（同時にxを直接根にくっつける操作も行う）
        if self.parents[x] < 0:
            return x
        else:
            self.parents[x] = self.find(self.parents[x])        # 右辺で再帰的に根を探索。根に到達すると一つ目のif判定に引っかかるので、
                                                                # 最終的にself.parents[根]が返ってくる。
                                                                # これを左辺に代入することで、根が親になるように変更する。（根までの距離が長いとO(N)になってしまうので）
            return self.parents[x]

    def union(self, x, y):                                      # 二つの木をくっつける（子を多く持つ方を根とした親子関係）。これは破壊的操作を行う。
        x = self.find(x)                                        # xをxの根に置き換える
        y = self.find(y)                                        # yをyの根に置き換える

        if x == y:                                              # 根が同じなら置き換える必要なし
            return

        if self.parents[x] > self.parents[y]:                   # 子がたくさんある方を x とする（出来るだけ浅い木にするため）
            x, y = y, x

        self.parents[x] += self.parents[y]                      # xの子の数を更新
        self.parents[y] = x                                     # yの親を更新

    def same(self, x, y):                                       # xとyが同じ根の子かを判定
        return self.find(x) == self.find(y)

    def size(self, x):                                          # xの根のparent（= 要素数）を返す
        return -self.parents[self.find(x)]

    def members(self, x):                                       # 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()}

    def __str__(self):                                          # print(self) での返し方を定義
        return '\n'.join('{}: {}'.format(r, self.members(r)) for r in self.roots())


##############################################################################################################
##### UnionFind を用いた連結判定
##############################################################################################################
V, E = map(int, input().split())                            # V: 頂点数　E: 辺の数
edges = [map(int, input().split()) for _ in range(E)]       # 辺で結ばれたペア
edges.reverse()
tree = UnionFind(V)
S = V*(V-1)//2
res = [S]
for a, b in edges:
    a -= 1
    b -= 1
    if tree.find(a) != tree.find(b):
        S -= len(tree.members(a))*len(tree.members(b))
    res.append(S)
    tree.union(a, b)                                        # 辺の増設クエリ
print(*list(reversed(res))[1:], sep="\n")

Fixed submission:
# https://atcoder.jp/contests/abc120/tasks/abc120_d


class UnionFind():

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

    def find(self,x):
        if self.parents[x] < 0:
            return x
        self.parents[x] = self.find(self.parents[x])
        return self.parents[x]

    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

    def size(self, x):                                          # xの根のparent（= 要素数）を返す
        return -self.parents[self.find(x)]

    def members(self, x):                                       # 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 [list(self.members(r)) for r in self.roots()]





from itertools import combinations
import sys
input = sys.stdin.readline

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

data = [map(int, input().split()) for _ in range(M)]

tree = UnionFind(N)

res = []
inconv = N*(N-1)//2

for a, b in reversed(data):                                 # O(M)
    a -= 1
    b -= 1
    if tree.find(a) != tree.find(b):
        inconv -= tree.size(a)*tree.size(b)
        tree.union(a, b)
    res.append(inconv)

res.pop()                                   # 橋が落ちる前の最初の状態については出力しない

for a in reversed(res):
    print(a)

print(N*(N-1)//2)                           # 全ての道が切れた時の不便さを最後に追加

'''

4 5
1 2
3 4
1 3
2 3
1 4

'''

Buggy python submission (verdict: Time Limit Exceeded):
# https://atcoder.jp/contests/abc120/tasks/abc120_d


class UnionFind():

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

    def find(self,x):
        if self.parents[x] < 0:
            return x
        self.parents[x] = self.find(self.parents[x])
        return self.parents[x]

    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

    def members(self, x):                                       # 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 [list(self.members(r)) for r in self.roots()]


from itertools import combinations
import sys
input = sys.stdin.readline

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

data = [map(int, input().split()) for _ in range(M)]

tree = UnionFind(N)

res = []

for a, b in reversed(data):
    a -= 1
    b -= 1
    tree.union(a, b)
    islands = tree.all_group_members()
    A = []
    for i in range(len(islands)):
        A.append(len(islands[i]))
    inconv = 0
    for p, q in combinations(A, 2):
        inconv += p*q
    res.append(inconv)

res.pop()                                   # 橋が落ちる前の最初の状態については出力しない

for a in reversed(res):
    print(a)

print(N*(N-1)//2)                           # 全ての道が切れた時の不便さを最後に追加

'''

4 5
1 2
3 4
1 3
2 3
1 4

'''

Fixed submission:
# https://atcoder.jp/contests/abc120/tasks/abc120_d


class UnionFind():

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

    def find(self,x):
        if self.parents[x] < 0:
            return x
        self.parents[x] = self.find(self.parents[x])
        return self.parents[x]

    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

    def size(self, x):                                          # xの根のparent（= 要素数）を返す
        return -self.parents[self.find(x)]

    def members(self, x):                                       # 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 [list(self.members(r)) for r in self.roots()]





from itertools import combinations
import sys
input = sys.stdin.readline

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

data = [map(int, input().split()) for _ in range(M)]

tree = UnionFind(N)

res = []
inconv = N*(N-1)//2

for a, b in reversed(data):                                 # O(M)
    a -= 1
    b -= 1
    if tree.find(a) != tree.find(b):
        inconv -= tree.size(a)*tree.size(b)
        tree.union(a, b)
    res.append(inconv)

res.pop()                                   # 橋が落ちる前の最初の状態については出力しない

for a in reversed(res):
    print(a)

print(N*(N-1)//2)                           # 全ての道が切れた時の不便さを最後に追加

'''

4 5
1 2
3 4
1 3
2 3
1 4

'''