import sys
input = sys.stdin.readline
class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots())

N, M = map(int, input().split())
ab = [list(map(int, input().split())) for _ in range(M)]
uf = UnionFind(N+1)
root_cnt = {i:1 for i in range(1, N+1)}
pair = N*(N-1)//2
ans = []
for i in range(M-1, -1, -1):
  ans += [pair]
  a, b = ab[i]
  ra = uf.Find_Root(a)
  rb = uf.Find_Root(b)
  if uf.isSameGroup(a, b):
    continue
  pair -= root_cnt[ra] * root_cnt[rb]
  uf.Unite(a, b)
  if root_cnt[ra] == root_cnt[uf.Find_Root(a)]:
    root_cnt[ra] += root_cnt[rb]
    root_cnt[rb] = 0
  else:
    root_cnt[rb] += root_cnt[ra]
    root_cnt[ra] = 0
  #root_cnt[uf.Find_Root(a)] += mem_a + mem_b - 1

for n in ans[::-1]:
  print(max(n, 0)) import sys sys input = sys.stdin.readline input sys.stdin.readline sys.stdin sys stdin readline class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots()) UnionFind def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
   __init__ self.n = n self.n self n n self.root = [-1]*(n+1) self.root self root [-1]*(n+1) [-1] -1 n+1 n 1 self.rnk = [0]*(n+1) self.rnk self rnk [0]*(n+1) [0] 0 n+1 n 1 self self n n def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
   Find_Root if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
   self.root[x] < 0 self.root[x] self.root self root x 0 return x x self.root[x] = self.Find_Root(self.root[x]) self.root[x] self.root self root x self.Find_Root(self.root[x]) self.Find_Root self Find_Root self.root[x] self.root self root x return self.root[x] self.root[x] self.root self root x self self x x def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
   Unite x = self.Find_Root(x) x self.Find_Root(x) self.Find_Root self Find_Root x y = self.Find_Root(y) y self.Find_Root(y) self.Find_Root self Find_Root y if(x == y):
      return 
     x == y x y return if self.root[x] > self.root[y]:
      x, y = y, x
     self.root[x] > self.root[y] self.root[x] self.root self root x self.root[y] self.root self root y x, y = y, x x y y x self.root[x] += self.root[y] self.root[x] self.root self root x self.root[y] self.root self root y self.root[y] = x self.root[y] self.root self root y x self self x x y y def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
   isSameGroup return self.Find_Root(x) == self.Find_Root(y) self.Find_Root(x) == self.Find_Root(y) self.Find_Root(x) self.Find_Root self Find_Root x self.Find_Root(y) self.Find_Root self Find_Root y self self x x y y def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
   Count return -self.root[self.Find_Root(x)] -self.root[self.Find_Root(x)] self.root[self.Find_Root(x)] self.root self root self.Find_Root(x) self.Find_Root self Find_Root x self self x x def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
   Members i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x) for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x) i range(self.n) range self.n self n self.Find_Root(i)==self.Find_Root(x) self.Find_Root(i) self.Find_Root self Find_Root i self.Find_Root(x) self.Find_Root self Find_Root x if self.Find_Root(i)==self.Find_Root(x) i return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)] [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)] self self x x def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
   Roots i for i, x in enumerate(self.root) if x < 0 for i, x in enumerate(self.root) if x < 0 i x enumerate(self.root) enumerate self.root self root x < 0 x 0 if x < 0 i return [i for i, x in enumerate(self.root) if x < 0] [i for i, x in enumerate(self.root) if x < 0] self self def Group_Count(self): # グループの数を返す
    return len(self.Roots()) Group_Count return len(self.Roots()) len(self.Roots()) len self.Roots() self.Roots self Roots self self 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 _ in range(M) for _ in range(M) _ range(M) range M for _ in range(M) list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split ab = [list(map(int, input().split())) for _ in range(M)] ab [list(map(int, input().split())) for _ in range(M)] uf = UnionFind(N+1) uf UnionFind(N+1) UnionFind N+1 N 1 i:1 for i in range(1, N+1) for i in range(1, N+1) i range(1, N+1) range 1 N+1 N 1 for i in range(1, N+1) i 1 root_cnt = {i:1 for i in range(1, N+1)} root_cnt {i:1 for i in range(1, N+1)} pair = N*(N-1)//2 pair N*(N-1)//2 N*(N-1) N N-1 N 1 2 ans = [] ans [] for i in range(M-1, -1, -1):
  ans += [pair]
  a, b = ab[i]
  ra = uf.Find_Root(a)
  rb = uf.Find_Root(b)
  if uf.isSameGroup(a, b):
    continue
  pair -= root_cnt[ra] * root_cnt[rb]
  uf.Unite(a, b)
  if root_cnt[ra] == root_cnt[uf.Find_Root(a)]:
    root_cnt[ra] += root_cnt[rb]
    root_cnt[rb] = 0
  else:
    root_cnt[rb] += root_cnt[ra]
    root_cnt[ra] = 0
  #root_cnt[uf.Find_Root(a)] += mem_a + mem_b - 1 i range(M-1, -1, -1) range M-1 M 1 -1 -1 ans += [pair] ans [pair] pair a, b = ab[i] a ab[i] ab i b ra = uf.Find_Root(a) ra uf.Find_Root(a) uf.Find_Root uf Find_Root a rb = uf.Find_Root(b) rb uf.Find_Root(b) uf.Find_Root uf Find_Root b if uf.isSameGroup(a, b):
    continue
   uf.isSameGroup(a, b) uf.isSameGroup uf isSameGroup a b continue pair -= root_cnt[ra] * root_cnt[rb] pair root_cnt[ra] * root_cnt[rb] root_cnt[ra] root_cnt ra root_cnt[rb] root_cnt rb uf.Unite(a, b) uf.Unite uf Unite a b if root_cnt[ra] == root_cnt[uf.Find_Root(a)]:
    root_cnt[ra] += root_cnt[rb]
    root_cnt[rb] = 0
  else:
    root_cnt[rb] += root_cnt[ra]
    root_cnt[ra] = 0
  #root_cnt[uf.Find_Root(a)] += mem_a + mem_b - 1 root_cnt[ra] == root_cnt[uf.Find_Root(a)] root_cnt[ra] root_cnt ra root_cnt[uf.Find_Root(a)] root_cnt uf.Find_Root(a) uf.Find_Root uf Find_Root a root_cnt[ra] += root_cnt[rb] root_cnt[ra] root_cnt ra root_cnt[rb] root_cnt rb root_cnt[rb] = 0 root_cnt[rb] root_cnt rb 0 root_cnt[rb] += root_cnt[ra] root_cnt[rb] root_cnt rb root_cnt[ra] root_cnt ra root_cnt[ra] = 0 root_cnt[ra] root_cnt ra 0 for n in ans[::-1]:
  print(max(n, 0)) n ans[::-1] ans ::-1 -1 print(max(n, 0)) print max(n, 0) max n 0 ra = uf.Find_Root(a) uf.Find_Root(a) ra root_cnt = {i:1 for i in range(1, N+1)} {i:1 for i in range(1, N+1)} root_cnt ans += [pair] [pair] ans ans = [] [] ans uf = UnionFind(N+1) UnionFind(N+1) uf ab = [list(map(int, input().split())) for _ in range(M)] [list(map(int, input().split())) for _ in range(M)] ab N, M = map(int, input().split()) map(int, input().split()) N pair -= root_cnt[ra] * root_cnt[rb] root_cnt[ra] * root_cnt[rb] pair pair = N*(N-1)//2 N*(N-1)//2 pair b = ab[i] ab[i] b rb = uf.Find_Root(b) uf.Find_Root(b) rb class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots()) class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots()) UnionFind input = sys.stdin.readline sys.stdin.readline input a, b = ab[i] ab[i] a M = map(int, input().split()) map(int, input().split()) M
import sys
input = sys.stdin.readline
class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots())

N, M = map(int, input().split())
ab = [list(map(int, input().split())) for _ in range(M)]
uf = UnionFind(N+1)
root_cnt = {i:1 for i in range(1, N+1)}
pair = N*(N-1)//2
ans = []
for i in range(M-1, -1, -1):
  ans += [pair]
  a, b = ab[i]
  ra = uf.Find_Root(a)
  rb = uf.Find_Root(b)
  if uf.isSameGroup(a, b):
    continue
  pair -= root_cnt[ra] * root_cnt[rb]
  uf.Unite(a, b)
  if root_cnt[ra] == root_cnt[uf.Find_Root(a)]:
    root_cnt[ra] += root_cnt[rb]
    root_cnt[rb] = 0
  else:
    root_cnt[rb] += root_cnt[ra]
    root_cnt[ra] = 0
  #root_cnt[uf.Find_Root(a)] += mem_a + mem_b - 1

for n in ans[::-1]:
  print(max(n, 0))