# Union Find

# xの根を求める
def find_root(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find_root(par[x])
        return par[x]


# xとyの属する集合の併合
def unite(x, y):
    x = find_root(x)
    y = find_root(y)

    if x == y:
        return False
    else:
        # sizeの大きいほうがx
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合に属するかの判定
def same(x, y):
    return find_root(x) == find_root(y)


# xが属する集合の個数
def size(x):
    return -par[find_root(x)]


# 初期化
# 根なら-size,子なら親の頂点

#nは要素数
n,m = map(int,input().split())
lis = [list(map(int,input().split())) for i in range(m)]
par = [-1] * n

hazime = n * (n-1) // 2

ans = []
num = 0
for a,b in lis[::-1]:
    a -= 1
    b -= 1
    x = find_root(a)
    y = find_root(b)
    if x != y:
        num += par[x] * par[y]
    unite(a,b)
    ans.append(num)
ans.insert(0,0)
  # print(ans)
for i in range(1,m+1):
    print(hazime-ans[-i-1]) def find_root(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find_root(par[x])
        return par[x]


# xとyの属する集合の併合 find_root if par[x] < 0:
        return x
    else:
        par[x] = find_root(par[x])
        return par[x]


# xとyの属する集合の併合 par[x] < 0 par[x] par x 0 return x x par[x] = find_root(par[x]) par[x] par x find_root(par[x]) find_root par[x] par x return par[x] par[x] par x x x def unite(x, y):
    x = find_root(x)
    y = find_root(y)

    if x == y:
        return False
    else:
        # sizeの大きいほうがx
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合に属するかの判定 unite x = find_root(x) x find_root(x) find_root x y = find_root(y) y find_root(y) find_root y if x == y:
        return False
    else:
        # sizeの大きいほうがx
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合に属するかの判定 x == y x y return False False if par[x] > par[y]:
            x, y = y, x
         par[x] > par[y] par[x] par x par[y] par y x, y = y, x x y y x par[x] += par[y] par[x] par x par[y] par y par[y] = x par[y] par y x return True True x x y y def same(x, y):
    return find_root(x) == find_root(y)


# xが属する集合の個数 same return find_root(x) == find_root(y) find_root(x) == find_root(y) find_root(x) find_root x find_root(y) find_root y x x y y def size(x):
    return -par[find_root(x)]


# 初期化
# 根なら-size,子なら親の頂点

#nは要素数 size return -par[find_root(x)] -par[find_root(x)] par[find_root(x)] par find_root(x) find_root x x x n,m = map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split m list(map(int,input().split())) for i in range(m) for i in range(m) i range(m) range m for i in range(m) list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split lis = [list(map(int,input().split())) for i in range(m)] lis [list(map(int,input().split())) for i in range(m)] par = [-1] * n par [-1] * n [-1] -1 n hazime = n * (n-1) // 2 hazime n * (n-1) // 2 n * (n-1) n n-1 n 1 2 ans = [] ans [] num = 0 num 0 for a,b in lis[::-1]:
    a -= 1
    b -= 1
    x = find_root(a)
    y = find_root(b)
    if x != y:
        num += par[x] * par[y]
    unite(a,b)
    ans.append(num) a b lis[::-1] lis ::-1 -1 a -= 1 a 1 b -= 1 b 1 x = find_root(a) x find_root(a) find_root a y = find_root(b) y find_root(b) find_root b if x != y:
        num += par[x] * par[y]
     x != y x y num += par[x] * par[y] num par[x] * par[y] par[x] par x par[y] par y unite(a,b) unite a b ans.append(num) ans.append ans append num ans.insert(0,0) ans.insert ans insert 0 0 for i in range(1,m+1):
    print(hazime-ans[-i-1]) i range(1,m+1) range 1 m+1 m 1 print(hazime-ans[-i-1]) print hazime-ans[-i-1] hazime ans[-i-1] ans -i-1 -i i 1 def find_root(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find_root(par[x])
        return par[x]


# xとyの属する集合の併合 def find_root(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find_root(par[x])
        return par[x]


# xとyの属する集合の併合 find_root b -= 1 1 b a -= 1 1 a y = find_root(b) find_root(b) y par = [-1] * n [-1] * n par num = 0 0 num def size(x):
    return -par[find_root(x)]


# 初期化
# 根なら-size,子なら親の頂点

#nは要素数 def size(x):
    return -par[find_root(x)]


# 初期化
# 根なら-size,子なら親の頂点

#nは要素数 size def same(x, y):
    return find_root(x) == find_root(y)


# xが属する集合の個数 def same(x, y):
    return find_root(x) == find_root(y)


# xが属する集合の個数 same n,m = map(int,input().split()) map(int,input().split()) n lis = [list(map(int,input().split())) for i in range(m)] [list(map(int,input().split())) for i in range(m)] lis hazime = n * (n-1) // 2 n * (n-1) // 2 hazime m = map(int,input().split()) map(int,input().split()) m ans = [] [] ans num += par[x] * par[y] par[x] * par[y] num def unite(x, y):
    x = find_root(x)
    y = find_root(y)

    if x == y:
        return False
    else:
        # sizeの大きいほうがx
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合に属するかの判定 def unite(x, y):
    x = find_root(x)
    y = find_root(y)

    if x == y:
        return False
    else:
        # sizeの大きいほうがx
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合に属するかの判定 unite x = find_root(a) find_root(a) x
# Union Find

# xの根を求める
def find_root(x):
    if par[x] < 0:
        return x
    else:
        par[x] = find_root(par[x])
        return par[x]


# xとyの属する集合の併合
def unite(x, y):
    x = find_root(x)
    y = find_root(y)

    if x == y:
        return False
    else:
        # sizeの大きいほうがx
        if par[x] > par[y]:
            x, y = y, x
        par[x] += par[y]
        par[y] = x
        return True


# xとyが同じ集合に属するかの判定
def same(x, y):
    return find_root(x) == find_root(y)


# xが属する集合の個数
def size(x):
    return -par[find_root(x)]


# 初期化
# 根なら-size,子なら親の頂点

#nは要素数
n,m = map(int,input().split())
lis = [list(map(int,input().split())) for i in range(m)]
par = [-1] * n

hazime = n * (n-1) // 2

ans = []
num = 0
for a,b in lis[::-1]:
    a -= 1
    b -= 1
    x = find_root(a)
    y = find_root(b)
    if x != y:
        num += par[x] * par[y]
    unite(a,b)
    ans.append(num)
ans.insert(0,0)
  # print(ans)
for i in range(1,m+1):
    print(hazime-ans[-i-1])