import sys

sys.setrecursionlimit(10**7)
def I(): return int(sys.stdin.readline().rstrip())
def MI(): return map(int,sys.stdin.readline().rstrip().split())
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))  #空白あり
def LI2(): return list(map(int,sys.stdin.readline().rstrip()))  #空白なし
def S(): return sys.stdin.readline().rstrip()
def LS(): return list(sys.stdin.readline().rstrip().split())  #空白あり
def LS2(): return list(sys.stdin.readline().rstrip())  #空白なし


class UnionFind:
    def __init__(self,n):
        self.par = [i for i in range(n+1)]  # 親のノード番号
        self.rank = [0]*(n+1)
        self.X = [0]+[1]*n
    def find(self,x):  # xの根のノード番号
        if self.par[x] == x:
            return x
        else:
            self.par[x] = self.find(self.par[x])
            return self.par[x]
    def same_check(self,x,y):  # x,yが同じグループか否か
        return self.find(x) == self.find(y)
    def unite(self,x,y):  # x,yの属するグループの併合
        x = self.find(x)
        y = self.find(y)
        if self.rank[x] < self.rank[y]:
            x,y = y,x
        if self.rank[x] == self.rank[y]:
            self.rank[x] += 1
        self.par[y] = x
        self.X[x] = self.X[x]+self.X[y]


N,M = MI()
UF = UnionFind(N)
AB = [tuple(MI()) for _ in range(M)]
AB.reverse()

ans = N*(N-1)//2
ANS = []
for i in range(M):
    ANS.append(ans)
    a,b = AB[i]
    if UF.same_check(a,b):
        continue
    else:
        ans -= UF.X[UF.find(a)]*UF.X[UF.find(b)]
        UF.unite(a,b)

ANS.reverse()
print(*ANS,sep='\n') import sys sys sys.setrecursionlimit(10**7) sys.setrecursionlimit sys setrecursionlimit 10**7 10 7 def I(): return int(sys.stdin.readline().rstrip()) I def MI(): return map(int,sys.stdin.readline().rstrip().split()) MI def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))  #空白あり LI def LI2(): return list(map(int,sys.stdin.readline().rstrip()))  #空白なし LI2 def S(): return sys.stdin.readline().rstrip() S def LS(): return list(sys.stdin.readline().rstrip().split())  #空白あり LS def LS2(): return list(sys.stdin.readline().rstrip())  #空白なし LS2 class UnionFind:
    def __init__(self,n):
        self.par = [i for i in range(n+1)]  # 親のノード番号
        self.rank = [0]*(n+1)
        self.X = [0]+[1]*n
    def find(self,x):  # xの根のノード番号
        if self.par[x] == x:
            return x
        else:
            self.par[x] = self.find(self.par[x])
            return self.par[x]
    def same_check(self,x,y):  # x,yが同じグループか否か
        return self.find(x) == self.find(y)
    def unite(self,x,y):  # x,yの属するグループの併合
        x = self.find(x)
        y = self.find(y)
        if self.rank[x] < self.rank[y]:
            x,y = y,x
        if self.rank[x] == self.rank[y]:
            self.rank[x] += 1
        self.par[y] = x
        self.X[x] = self.X[x]+self.X[y] UnionFind def __init__(self,n):
        self.par = [i for i in range(n+1)]  # 親のノード番号
        self.rank = [0]*(n+1)
        self.X = [0]+[1]*n
     __init__ i for i in range(n+1) for i in range(n+1) i range(n+1) range n+1 n 1 for i in range(n+1) i self.par = [i for i in range(n+1)] self.par self par [i for i in range(n+1)] self.rank = [0]*(n+1) self.rank self rank [0]*(n+1) [0] 0 n+1 n 1 self.X = [0]+[1]*n self.X self X [0]+[1]*n [0] 0 [1]*n [1] 1 n self self n n def find(self,x):  # xの根のノード番号
        if self.par[x] == x:
            return x
        else:
            self.par[x] = self.find(self.par[x])
            return self.par[x]
     find if self.par[x] == x:
            return x
        else:
            self.par[x] = self.find(self.par[x])
            return self.par[x]
     self.par[x] == x self.par[x] self.par self par x x return x x self.par[x] = self.find(self.par[x]) self.par[x] self.par self par x self.find(self.par[x]) self.find self find self.par[x] self.par self par x return self.par[x] self.par[x] self.par self par x self self x x def same_check(self,x,y):  # x,yが同じグループか否か
        return self.find(x) == self.find(y)
     same_check return self.find(x) == self.find(y) self.find(x) == self.find(y) self.find(x) self.find self find x self.find(y) self.find self find y self self x x y y def unite(self,x,y):  # x,yの属するグループの併合
        x = self.find(x)
        y = self.find(y)
        if self.rank[x] < self.rank[y]:
            x,y = y,x
        if self.rank[x] == self.rank[y]:
            self.rank[x] += 1
        self.par[y] = x
        self.X[x] = self.X[x]+self.X[y] unite x = self.find(x) x self.find(x) self.find self find x y = self.find(y) y self.find(y) self.find self find y if self.rank[x] < self.rank[y]:
            x,y = y,x
         self.rank[x] < self.rank[y] self.rank[x] self.rank self rank x self.rank[y] self.rank self rank y x,y = y,x x y y x if self.rank[x] == self.rank[y]:
            self.rank[x] += 1
         self.rank[x] == self.rank[y] self.rank[x] self.rank self rank x self.rank[y] self.rank self rank y self.rank[x] += 1 self.rank[x] self.rank self rank x 1 self.par[y] = x self.par[y] self.par self par y x self.X[x] = self.X[x]+self.X[y] self.X[x] self.X self X x self.X[x]+self.X[y] self.X[x] self.X self X x self.X[y] self.X self X y self self x x y y N,M = MI() N MI() MI M UF = UnionFind(N) UF UnionFind(N) UnionFind N tuple(MI()) for _ in range(M) for _ in range(M) _ range(M) range M for _ in range(M) tuple(MI()) tuple MI() MI AB = [tuple(MI()) for _ in range(M)] AB [tuple(MI()) for _ in range(M)] AB.reverse() AB.reverse AB reverse ans = N*(N-1)//2 ans N*(N-1)//2 N*(N-1) N N-1 N 1 2 ANS = [] ANS [] for i in range(M):
    ANS.append(ans)
    a,b = AB[i]
    if UF.same_check(a,b):
        continue
    else:
        ans -= UF.X[UF.find(a)]*UF.X[UF.find(b)]
        UF.unite(a,b) i range(M) range M ANS.append(ans) ANS.append ANS append ans a,b = AB[i] a AB[i] AB i b if UF.same_check(a,b):
        continue
    else:
        ans -= UF.X[UF.find(a)]*UF.X[UF.find(b)]
        UF.unite(a,b) UF.same_check(a,b) UF.same_check UF same_check a b continue ans -= UF.X[UF.find(a)]*UF.X[UF.find(b)] ans UF.X[UF.find(a)]*UF.X[UF.find(b)] UF.X[UF.find(a)] UF.X UF X UF.find(a) UF.find UF find a UF.X[UF.find(b)] UF.X UF X UF.find(b) UF.find UF find b UF.unite(a,b) UF.unite UF unite a b ANS.reverse() ANS.reverse ANS reverse print(*ANS,sep='\n') print *ANS ANS sep='\n' sep '\n' AB = [tuple(MI()) for _ in range(M)] [tuple(MI()) for _ in range(M)] AB b = AB[i] AB[i] b def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))  #空白あり def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))  #空白あり LI UF = UnionFind(N) UnionFind(N) UF def I(): return int(sys.stdin.readline().rstrip()) def I(): return int(sys.stdin.readline().rstrip()) I class UnionFind:
    def __init__(self,n):
        self.par = [i for i in range(n+1)]  # 親のノード番号
        self.rank = [0]*(n+1)
        self.X = [0]+[1]*n
    def find(self,x):  # xの根のノード番号
        if self.par[x] == x:
            return x
        else:
            self.par[x] = self.find(self.par[x])
            return self.par[x]
    def same_check(self,x,y):  # x,yが同じグループか否か
        return self.find(x) == self.find(y)
    def unite(self,x,y):  # x,yの属するグループの併合
        x = self.find(x)
        y = self.find(y)
        if self.rank[x] < self.rank[y]:
            x,y = y,x
        if self.rank[x] == self.rank[y]:
            self.rank[x] += 1
        self.par[y] = x
        self.X[x] = self.X[x]+self.X[y] class UnionFind:
    def __init__(self,n):
        self.par = [i for i in range(n+1)]  # 親のノード番号
        self.rank = [0]*(n+1)
        self.X = [0]+[1]*n
    def find(self,x):  # xの根のノード番号
        if self.par[x] == x:
            return x
        else:
            self.par[x] = self.find(self.par[x])
            return self.par[x]
    def same_check(self,x,y):  # x,yが同じグループか否か
        return self.find(x) == self.find(y)
    def unite(self,x,y):  # x,yの属するグループの併合
        x = self.find(x)
        y = self.find(y)
        if self.rank[x] < self.rank[y]:
            x,y = y,x
        if self.rank[x] == self.rank[y]:
            self.rank[x] += 1
        self.par[y] = x
        self.X[x] = self.X[x]+self.X[y] UnionFind ANS = [] [] ANS def LI2(): return list(map(int,sys.stdin.readline().rstrip()))  #空白なし def LI2(): return list(map(int,sys.stdin.readline().rstrip()))  #空白なし LI2 M = MI() MI() M def S(): return sys.stdin.readline().rstrip() def S(): return sys.stdin.readline().rstrip() S def LS(): return list(sys.stdin.readline().rstrip().split())  #空白あり def LS(): return list(sys.stdin.readline().rstrip().split())  #空白あり LS N,M = MI() MI() N ans -= UF.X[UF.find(a)]*UF.X[UF.find(b)] UF.X[UF.find(a)]*UF.X[UF.find(b)] ans ans = N*(N-1)//2 N*(N-1)//2 ans a,b = AB[i] AB[i] a def LS2(): return list(sys.stdin.readline().rstrip())  #空白なし def LS2(): return list(sys.stdin.readline().rstrip())  #空白なし LS2 def MI(): return map(int,sys.stdin.readline().rstrip().split()) def MI(): return map(int,sys.stdin.readline().rstrip().split()) MI
import sys

sys.setrecursionlimit(10**7)
def I(): return int(sys.stdin.readline().rstrip())
def MI(): return map(int,sys.stdin.readline().rstrip().split())
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))  #空白あり
def LI2(): return list(map(int,sys.stdin.readline().rstrip()))  #空白なし
def S(): return sys.stdin.readline().rstrip()
def LS(): return list(sys.stdin.readline().rstrip().split())  #空白あり
def LS2(): return list(sys.stdin.readline().rstrip())  #空白なし


class UnionFind:
    def __init__(self,n):
        self.par = [i for i in range(n+1)]  # 親のノード番号
        self.rank = [0]*(n+1)
        self.X = [0]+[1]*n
    def find(self,x):  # xの根のノード番号
        if self.par[x] == x:
            return x
        else:
            self.par[x] = self.find(self.par[x])
            return self.par[x]
    def same_check(self,x,y):  # x,yが同じグループか否か
        return self.find(x) == self.find(y)
    def unite(self,x,y):  # x,yの属するグループの併合
        x = self.find(x)
        y = self.find(y)
        if self.rank[x] < self.rank[y]:
            x,y = y,x
        if self.rank[x] == self.rank[y]:
            self.rank[x] += 1
        self.par[y] = x
        self.X[x] = self.X[x]+self.X[y]


N,M = MI()
UF = UnionFind(N)
AB = [tuple(MI()) for _ in range(M)]
AB.reverse()

ans = N*(N-1)//2
ANS = []
for i in range(M):
    ANS.append(ans)
    a,b = AB[i]
    if UF.same_check(a,b):
        continue
    else:
        ans -= UF.X[UF.find(a)]*UF.X[UF.find(b)]
        UF.unite(a,b)

ANS.reverse()
print(*ANS,sep='\n')
