class UnionFind():
  def __init__(self, n=10**6):
    self.n=n
    self.root=[-1]*(n+1)
    self.rnk=[0]*(n+1)
  def find(self, x):
    if(self.root[x]<0):
      return x
    else:
      self.root[x]=self.find(self.root[x])
      return self.root[x]
  def unite(self, x, y):
    x=self.find(x)
    y=self.find(y)
    if(x==y):return 
    elif(self.rnk[x] > self.rnk[y]):
      self.root[x]+=self.root[y]
      self.root[y]=x
    else:
      self.root[y]+=self.root[x]
      self.root[x]=y
      if(self.rnk[x]==self.rnk[y]):
        self.rnk[y]+=1
  def same(self, x, y):
    return self.find(x)==self.find(y)
  def count(self, x):
    return -self.root[self.find(x)]
n,m=map(int,input().split())
uf=UnionFind(n)
a=[0]*m
b=[0]*m
for i in range(m):
  a[i],b[i]=map(int,input().split())
c=[1]*(n+1)
ans=[]
nm=n*(n-1)//2
for i in range(m-1,-1,-1):
  ans+=[nm]
  x,y=a[i],b[i]
  if uf.same(x,y):continue
  nm-=uf.count(x)*uf.count(y)
  uf.unite(x,y)
print(*ans[::-1],sep='\n') class UnionFind():
  def __init__(self, n=10**6):
    self.n=n
    self.root=[-1]*(n+1)
    self.rnk=[0]*(n+1)
  def find(self, x):
    if(self.root[x]<0):
      return x
    else:
      self.root[x]=self.find(self.root[x])
      return self.root[x]
  def unite(self, x, y):
    x=self.find(x)
    y=self.find(y)
    if(x==y):return 
    elif(self.rnk[x] > self.rnk[y]):
      self.root[x]+=self.root[y]
      self.root[y]=x
    else:
      self.root[y]+=self.root[x]
      self.root[x]=y
      if(self.rnk[x]==self.rnk[y]):
        self.rnk[y]+=1
  def same(self, x, y):
    return self.find(x)==self.find(y)
  def count(self, x):
    return -self.root[self.find(x)] UnionFind def __init__(self, n=10**6):
    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=10**6 n 10**6 10 6 def find(self, x):
    if(self.root[x]<0):
      return x
    else:
      self.root[x]=self.find(self.root[x])
      return self.root[x]
   find if(self.root[x]<0):
      return x
    else:
      self.root[x]=self.find(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(self.root[x]) self.root[x] self.root self root x self.find(self.root[x]) self.find self find 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(x)
    y=self.find(y)
    if(x==y):return 
    elif(self.rnk[x] > self.rnk[y]):
      self.root[x]+=self.root[y]
      self.root[y]=x
    else:
      self.root[y]+=self.root[x]
      self.root[x]=y
      if(self.rnk[x]==self.rnk[y]):
        self.rnk[y]+=1
   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(x==y):return 
    elif(self.rnk[x] > self.rnk[y]):
      self.root[x]+=self.root[y]
      self.root[y]=x
    else:
      self.root[y]+=self.root[x]
      self.root[x]=y
      if(self.rnk[x]==self.rnk[y]):
        self.rnk[y]+=1
   x==y x y elif(self.rnk[x] > self.rnk[y]):
      self.root[x]+=self.root[y]
      self.root[y]=x
     self.rnk[x] > self.rnk[y] self.rnk[x] self.rnk self rnk x self.rnk[y] self.rnk self rnk y 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.root[y]+=self.root[x] self.root[y] self.root self root y self.root[x] self.root self root x self.root[x]=y self.root[x] self.root self root x y if(self.rnk[x]==self.rnk[y]):
        self.rnk[y]+=1
   self.rnk[x]==self.rnk[y] self.rnk[x] self.rnk self rnk x self.rnk[y] self.rnk self rnk y self.rnk[y]+=1 self.rnk[y] self.rnk self rnk y 1 self self x x y y def same(self, x, y):
    return self.find(x)==self.find(y)
   same 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 count(self, x):
    return -self.root[self.find(x)] count return -self.root[self.find(x)] -self.root[self.find(x)] self.root[self.find(x)] self.root self root self.find(x) self.find self find x self self x x n,m=map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split m uf=UnionFind(n) uf UnionFind(n) UnionFind n a=[0]*m a [0]*m [0] 0 m b=[0]*m b [0]*m [0] 0 m for i in range(m):
  a[i],b[i]=map(int,input().split()) i range(m) range m a[i],b[i]=map(int,input().split()) a[i] a i map(int,input().split()) map int input().split() ().split () input split b[i] b i c=[1]*(n+1) c [1]*(n+1) [1] 1 n+1 n 1 ans=[] ans [] nm=n*(n-1)//2 nm n*(n-1)//2 n*(n-1) n n-1 n 1 2 for i in range(m-1,-1,-1):
  ans+=[nm]
  x,y=a[i],b[i]
  if uf.same(x,y):continue
  nm-=uf.count(x)*uf.count(y)
  uf.unite(x,y) i range(m-1,-1,-1) range m-1 m 1 -1 -1 ans+=[nm] ans [nm] nm x,y=a[i],b[i] x a[i] a i y b[i] b i if uf.same(x,y):continue
   uf.same(x,y) uf.same uf same x y nm-=uf.count(x)*uf.count(y) nm uf.count(x)*uf.count(y) uf.count(x) uf.count uf count x uf.count(y) uf.count uf count y uf.unite(x,y) uf.unite uf unite x y print(*ans[::-1],sep='\n') print *ans[::-1] ans[::-1] ans ::-1 -1 sep='\n' sep '\n' m=map(int,input().split()) map(int,input().split()) m class UnionFind():
  def __init__(self, n=10**6):
    self.n=n
    self.root=[-1]*(n+1)
    self.rnk=[0]*(n+1)
  def find(self, x):
    if(self.root[x]<0):
      return x
    else:
      self.root[x]=self.find(self.root[x])
      return self.root[x]
  def unite(self, x, y):
    x=self.find(x)
    y=self.find(y)
    if(x==y):return 
    elif(self.rnk[x] > self.rnk[y]):
      self.root[x]+=self.root[y]
      self.root[y]=x
    else:
      self.root[y]+=self.root[x]
      self.root[x]=y
      if(self.rnk[x]==self.rnk[y]):
        self.rnk[y]+=1
  def same(self, x, y):
    return self.find(x)==self.find(y)
  def count(self, x):
    return -self.root[self.find(x)] class UnionFind():
  def __init__(self, n=10**6):
    self.n=n
    self.root=[-1]*(n+1)
    self.rnk=[0]*(n+1)
  def find(self, x):
    if(self.root[x]<0):
      return x
    else:
      self.root[x]=self.find(self.root[x])
      return self.root[x]
  def unite(self, x, y):
    x=self.find(x)
    y=self.find(y)
    if(x==y):return 
    elif(self.rnk[x] > self.rnk[y]):
      self.root[x]+=self.root[y]
      self.root[y]=x
    else:
      self.root[y]+=self.root[x]
      self.root[x]=y
      if(self.rnk[x]==self.rnk[y]):
        self.rnk[y]+=1
  def same(self, x, y):
    return self.find(x)==self.find(y)
  def count(self, x):
    return -self.root[self.find(x)] UnionFind x,y=a[i],b[i] a[i] x b=[0]*m [0]*m b n,m=map(int,input().split()) map(int,input().split()) n a=[0]*m [0]*m a y=a[i],b[i] b[i] y nm=n*(n-1)//2 n*(n-1)//2 nm c=[1]*(n+1) [1]*(n+1) c ans+=[nm] [nm] ans ans=[] [] ans uf=UnionFind(n) UnionFind(n) uf nm-=uf.count(x)*uf.count(y) uf.count(x)*uf.count(y) nm
class UnionFind():
  def __init__(self, n=10**6):
    self.n=n
    self.root=[-1]*(n+1)
    self.rnk=[0]*(n+1)
  def find(self, x):
    if(self.root[x]<0):
      return x
    else:
      self.root[x]=self.find(self.root[x])
      return self.root[x]
  def unite(self, x, y):
    x=self.find(x)
    y=self.find(y)
    if(x==y):return 
    elif(self.rnk[x] > self.rnk[y]):
      self.root[x]+=self.root[y]
      self.root[y]=x
    else:
      self.root[y]+=self.root[x]
      self.root[x]=y
      if(self.rnk[x]==self.rnk[y]):
        self.rnk[y]+=1
  def same(self, x, y):
    return self.find(x)==self.find(y)
  def count(self, x):
    return -self.root[self.find(x)]
n,m=map(int,input().split())
uf=UnionFind(n)
a=[0]*m
b=[0]*m
for i in range(m):
  a[i],b[i]=map(int,input().split())
c=[1]*(n+1)
ans=[]
nm=n*(n-1)//2
for i in range(m-1,-1,-1):
  ans+=[nm]
  x,y=a[i],b[i]
  if uf.same(x,y):continue
  nm-=uf.count(x)*uf.count(y)
  uf.unite(x,y)
print(*ans[::-1],sep='\n')