import sys
sys.setrecursionlimit(10**7)

def find(x):#xの親を見つける
  if par[x] < 0:
    return x
  else:
    par[x] = find(par[x])
    return par[x]

def unite(x,y):#要素xとｙを併合させる
  x,y=find(x),find(y)#xとyの親の検索
  if x!=y:#親が異なる場合併合させる
    if x>y:
        x,y=y,x#小さい方をxとする. これにより要素の値が小さいものを優先して木の根とする. 
    par[x]+=par[y] #値を無向木の要素数の和にする.
    par[y]=x #枝側は根の位置を格納

def same(x, y):#要素xと要素yが同じ無向木に所属しているかを判定する
  return find(x) == find(y)#同じ値を持つか否か

def size(x):#要素xが所属する無向木の大きさを返す
  return-par[find(x)]

n, m = map(int, input().split()) #要素の数
par = [-1] * n #
path = []
for i in range(m):
  a, b = map(int, input().split())
  path.append([a-1, b-1])
ans_l = [n*(n-1)//2]
for i in range(m-1, 0, -1):
  if same(path[i][0], path[i][1]):
    ans_l.append(ans_l[-1])
    unite(path[i][0], path[i][1])
  else:
    ans_l.append(ans_l[-1] - size(path[i][0])*size(path[i][1]))
    unite(path[i][0], path[i][1])
for i in range(m-1, -1, -1):
  print(ans_l[i]) import sys sys sys.setrecursionlimit(10**7) sys.setrecursionlimit sys setrecursionlimit 10**7 10 7 def find(x):#xの親を見つける
  if par[x] < 0:
    return x
  else:
    par[x] = find(par[x])
    return par[x] find if par[x] < 0:
    return x
  else:
    par[x] = find(par[x])
    return par[x] par[x] < 0 par[x] par x 0 return x x par[x] = find(par[x]) par[x] par x find(par[x]) find par[x] par x return par[x] par[x] par x x x def unite(x,y):#要素xとｙを併合させる
  x,y=find(x),find(y)#xとyの親の検索
  if x!=y:#親が異なる場合併合させる
    if x>y:
        x,y=y,x#小さい方をxとする. これにより要素の値が小さいものを優先して木の根とする. 
    par[x]+=par[y] #値を無向木の要素数の和にする.
    par[y]=x #枝側は根の位置を格納 unite x,y=find(x),find(y) x find(x) find x y find(y) find y if x!=y:#親が異なる場合併合させる
    if x>y:
        x,y=y,x#小さい方をxとする. これにより要素の値が小さいものを優先して木の根とする. 
    par[x]+=par[y] #値を無向木の要素数の和にする.
    par[y]=x #枝側は根の位置を格納 x!=y x y if x>y:
        x,y=y,x#小さい方をxとする. これにより要素の値が小さいものを優先して木の根とする. 
     x>y x 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 x x y y def same(x, y):#要素xと要素yが同じ無向木に所属しているかを判定する
  return find(x) == find(y)#同じ値を持つか否か same return find(x) == find(y) find(x) == find(y) find(x) find x find(y) find y x x y y def size(x):#要素xが所属する無向木の大きさを返す
  return-par[find(x)] size return-par[find(x)] -par[find(x)] par[find(x)] par find(x) find x x x n, m = map(int, input().split()) n map(int, input().split()) map int input().split() ().split () input split m par = [-1] * n par [-1] * n [-1] -1 n path = [] path [] for i in range(m):
  a, b = map(int, input().split())
  path.append([a-1, b-1]) i range(m) range m a, b = map(int, input().split()) a map(int, input().split()) map int input().split() ().split () input split b path.append([a-1, b-1]) path.append path append [a-1, b-1] a-1 a 1 b-1 b 1 ans_l = [n*(n-1)//2] ans_l [n*(n-1)//2] n*(n-1)//2 n*(n-1) n n-1 n 1 2 for i in range(m-1, 0, -1):
  if same(path[i][0], path[i][1]):
    ans_l.append(ans_l[-1])
    unite(path[i][0], path[i][1])
  else:
    ans_l.append(ans_l[-1] - size(path[i][0])*size(path[i][1]))
    unite(path[i][0], path[i][1]) i range(m-1, 0, -1) range m-1 m 1 0 -1 if same(path[i][0], path[i][1]):
    ans_l.append(ans_l[-1])
    unite(path[i][0], path[i][1])
  else:
    ans_l.append(ans_l[-1] - size(path[i][0])*size(path[i][1]))
    unite(path[i][0], path[i][1]) same(path[i][0], path[i][1]) same path[i][0] [i] path i 0 path[i][1] [i] path i 1 ans_l.append(ans_l[-1]) ans_l.append ans_l append ans_l[-1] ans_l -1 unite(path[i][0], path[i][1]) unite path[i][0] [i] path i 0 path[i][1] [i] path i 1 ans_l.append(ans_l[-1] - size(path[i][0])*size(path[i][1])) ans_l.append ans_l append ans_l[-1] - size(path[i][0])*size(path[i][1]) ans_l[-1] ans_l -1 size(path[i][0])*size(path[i][1]) size(path[i][0]) size path[i][0] [i] path i 0 size(path[i][1]) size path[i][1] [i] path i 1 unite(path[i][0], path[i][1]) unite path[i][0] [i] path i 0 path[i][1] [i] path i 1 for i in range(m-1, -1, -1):
  print(ans_l[i]) i range(m-1, -1, -1) range m-1 m 1 -1 -1 print(ans_l[i]) print ans_l[i] ans_l i def size(x):#要素xが所属する無向木の大きさを返す
  return-par[find(x)] def size(x):#要素xが所属する無向木の大きさを返す
  return-par[find(x)] size m = map(int, input().split()) map(int, input().split()) m par = [-1] * n [-1] * n par path = [] [] path a, b = map(int, input().split()) map(int, input().split()) a b = map(int, input().split()) map(int, input().split()) b def unite(x,y):#要素xとｙを併合させる
  x,y=find(x),find(y)#xとyの親の検索
  if x!=y:#親が異なる場合併合させる
    if x>y:
        x,y=y,x#小さい方をxとする. これにより要素の値が小さいものを優先して木の根とする. 
    par[x]+=par[y] #値を無向木の要素数の和にする.
    par[y]=x #枝側は根の位置を格納 def unite(x,y):#要素xとｙを併合させる
  x,y=find(x),find(y)#xとyの親の検索
  if x!=y:#親が異なる場合併合させる
    if x>y:
        x,y=y,x#小さい方をxとする. これにより要素の値が小さいものを優先して木の根とする. 
    par[x]+=par[y] #値を無向木の要素数の和にする.
    par[y]=x #枝側は根の位置を格納 unite def same(x, y):#要素xと要素yが同じ無向木に所属しているかを判定する
  return find(x) == find(y)#同じ値を持つか否か def same(x, y):#要素xと要素yが同じ無向木に所属しているかを判定する
  return find(x) == find(y)#同じ値を持つか否か same ans_l = [n*(n-1)//2] [n*(n-1)//2] ans_l n, m = map(int, input().split()) map(int, input().split()) n def find(x):#xの親を見つける
  if par[x] < 0:
    return x
  else:
    par[x] = find(par[x])
    return par[x] def find(x):#xの親を見つける
  if par[x] < 0:
    return x
  else:
    par[x] = find(par[x])
    return par[x] find
import sys
sys.setrecursionlimit(10**7)

def find(x):#xの親を見つける
  if par[x] < 0:
    return x
  else:
    par[x] = find(par[x])
    return par[x]

def unite(x,y):#要素xとｙを併合させる
  x,y=find(x),find(y)#xとyの親の検索
  if x!=y:#親が異なる場合併合させる
    if x>y:
        x,y=y,x#小さい方をxとする. これにより要素の値が小さいものを優先して木の根とする. 
    par[x]+=par[y] #値を無向木の要素数の和にする.
    par[y]=x #枝側は根の位置を格納

def same(x, y):#要素xと要素yが同じ無向木に所属しているかを判定する
  return find(x) == find(y)#同じ値を持つか否か

def size(x):#要素xが所属する無向木の大きさを返す
  return-par[find(x)]

n, m = map(int, input().split()) #要素の数
par = [-1] * n #
path = []
for i in range(m):
  a, b = map(int, input().split())
  path.append([a-1, b-1])
ans_l = [n*(n-1)//2]
for i in range(m-1, 0, -1):
  if same(path[i][0], path[i][1]):
    ans_l.append(ans_l[-1])
    unite(path[i][0], path[i][1])
  else:
    ans_l.append(ans_l[-1] - size(path[i][0])*size(path[i][1]))
    unite(path[i][0], path[i][1])
for i in range(m-1, -1, -1):
  print(ans_l[i])