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 
    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 isSameGroup(self,x,y):
    return self.Find_Root(x)==self.Find_Root(y)
  def Count(self,x):
    return -self.root[self.Find_Root(x)]
N,M=map(int,input().split())
uf=UnionFind(N)
AB=[]
for i in range(M):
  AB.append(list(map(int,input().split())))
ans=[0]*M
ans[M-1]=(N*(N-1))//2
for i in range(M-2,-1,-1):
  if uf.isSameGroup(AB[i+1][0],AB[i+1][1]):
    ans[i]=ans[i+1]
  else:
    n1=uf.Count(AB[i+1][0])
    n2=uf.Count(AB[i+1][1])
    ans[i]=ans[i+1]-n1*n2
  uf.Unite(AB[i+1][0],AB[i+1][1])
for i in range(M):
  print(ans[i]) 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 
    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 isSameGroup(self,x,y):
    return self.Find_Root(x)==self.Find_Root(y)
  def Count(self,x):
    return -self.root[self.Find_Root(x)] 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 
    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_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 
    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 return 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 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):
    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 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 AB=[] AB [] for i in range(M):
  AB.append(list(map(int,input().split()))) i range(M) range M AB.append(list(map(int,input().split()))) AB.append AB append list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split ans=[0]*M ans [0]*M [0] 0 M ans[M-1]=(N*(N-1))//2 ans[M-1] ans M-1 M 1 (N*(N-1))//2 N*(N-1) N N-1 N 1 2 for i in range(M-2,-1,-1):
  if uf.isSameGroup(AB[i+1][0],AB[i+1][1]):
    ans[i]=ans[i+1]
  else:
    n1=uf.Count(AB[i+1][0])
    n2=uf.Count(AB[i+1][1])
    ans[i]=ans[i+1]-n1*n2
  uf.Unite(AB[i+1][0],AB[i+1][1]) i range(M-2,-1,-1) range M-2 M 2 -1 -1 if uf.isSameGroup(AB[i+1][0],AB[i+1][1]):
    ans[i]=ans[i+1]
  else:
    n1=uf.Count(AB[i+1][0])
    n2=uf.Count(AB[i+1][1])
    ans[i]=ans[i+1]-n1*n2
   uf.isSameGroup(AB[i+1][0],AB[i+1][1]) uf.isSameGroup uf isSameGroup AB[i+1][0] [i+1] AB i+1 i 1 0 AB[i+1][1] [i+1] AB i+1 i 1 1 ans[i]=ans[i+1] ans[i] ans i ans[i+1] ans i+1 i 1 n1=uf.Count(AB[i+1][0]) n1 uf.Count(AB[i+1][0]) uf.Count uf Count AB[i+1][0] [i+1] AB i+1 i 1 0 n2=uf.Count(AB[i+1][1]) n2 uf.Count(AB[i+1][1]) uf.Count uf Count AB[i+1][1] [i+1] AB i+1 i 1 1 ans[i]=ans[i+1]-n1*n2 ans[i] ans i ans[i+1]-n1*n2 ans[i+1] ans i+1 i 1 n1*n2 n1 n2 uf.Unite(AB[i+1][0],AB[i+1][1]) uf.Unite uf Unite AB[i+1][0] [i+1] AB i+1 i 1 0 AB[i+1][1] [i+1] AB i+1 i 1 1 for i in range(M):
  print(ans[i]) i range(M) range M print(ans[i]) print ans[i] ans i uf=UnionFind(N) UnionFind(N) uf AB=[] [] AB M=map(int,input().split()) map(int,input().split()) M ans=[0]*M [0]*M ans n2=uf.Count(AB[i+1][1]) uf.Count(AB[i+1][1]) n2 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 
    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 isSameGroup(self,x,y):
    return self.Find_Root(x)==self.Find_Root(y)
  def Count(self,x):
    return -self.root[self.Find_Root(x)] 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 
    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 isSameGroup(self,x,y):
    return self.Find_Root(x)==self.Find_Root(y)
  def Count(self,x):
    return -self.root[self.Find_Root(x)] UnionFind n1=uf.Count(AB[i+1][0]) uf.Count(AB[i+1][0]) n1 N,M=map(int,input().split()) map(int,input().split()) N
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 
    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 isSameGroup(self,x,y):
    return self.Find_Root(x)==self.Find_Root(y)
  def Count(self,x):
    return -self.root[self.Find_Root(x)]
N,M=map(int,input().split())
uf=UnionFind(N)
AB=[]
for i in range(M):
  AB.append(list(map(int,input().split())))
ans=[0]*M
ans[M-1]=(N*(N-1))//2
for i in range(M-2,-1,-1):
  if uf.isSameGroup(AB[i+1][0],AB[i+1][1]):
    ans[i]=ans[i+1]
  else:
    n1=uf.Count(AB[i+1][0])
    n2=uf.Count(AB[i+1][1])
    ans[i]=ans[i+1]-n1*n2
  uf.Unite(AB[i+1][0],AB[i+1][1])
for i in range(M):
  print(ans[i])