import sys
def input(): return sys.stdin.readline().rstrip()
class UnionFind():
    def __init__(self, n):
        self.n=n
        self.parents=[-1]*n # 親(uf.find()で経路圧縮して根)の番号。根の場合は-(そのグループの要素数)
    def find(self,x):
        #グループの根を返す
        if self.parents[x]<0:return x
        else:
            self.parents[x]=self.find(self.parents[x])
            return self.parents[x]
    def unite(self,x,y):
        #要素x,yのグループを併合
        x,y=self.find(x),self.find(y)
        if x==y:return
        if self.parents[x]>self.parents[y]:#要素数の大きい方をxに
            x,y=y,x
        self.parents[x]+=self.parents[y]
        self.parents[y]=x #要素数が大きい方に併合
    def size(self,x):
        #xが属するグループの要素数
        return -self.parents[self.find(x)]
    def same(self,x,y):
        #xとyが同じグループ？
        return self.find(x)==self.find(y)
def main():
    n,m=map(int,input().split())
    AB=[tuple(map(int,input().split())) for i in range(m)]
    ANS=[0]*(m+1)
    ANS[0]=n*(n-1)//2
    uf=UnionFind(n)
    i=0
    for a,b in AB[::-1]:
        a-=1
        b-=1
        if uf.same(a,b):
            ANS[i+1]=ANS[i]
        else:
            na=uf.size(a)
            nb=uf.size(b)
            ANS[i+1]=ANS[i]-na*nb
            uf.unite(a,b)
        i+=1
    for i in range(m):
        print(ANS[-2-i])


if __name__=='__main__':
    main() import sys sys def input(): return sys.stdin.readline().rstrip() input class UnionFind():
    def __init__(self, n):
        self.n=n
        self.parents=[-1]*n # 親(uf.find()で経路圧縮して根)の番号。根の場合は-(そのグループの要素数)
    def find(self,x):
        #グループの根を返す
        if self.parents[x]<0:return x
        else:
            self.parents[x]=self.find(self.parents[x])
            return self.parents[x]
    def unite(self,x,y):
        #要素x,yのグループを併合
        x,y=self.find(x),self.find(y)
        if x==y:return
        if self.parents[x]>self.parents[y]:#要素数の大きい方をxに
            x,y=y,x
        self.parents[x]+=self.parents[y]
        self.parents[y]=x #要素数が大きい方に併合
    def size(self,x):
        #xが属するグループの要素数
        return -self.parents[self.find(x)]
    def same(self,x,y):
        #xとyが同じグループ？
        return self.find(x)==self.find(y) UnionFind def __init__(self, n):
        self.n=n
        self.parents=[-1]*n # 親(uf.find()で経路圧縮して根)の番号。根の場合は-(そのグループの要素数)
     __init__ self.n=n self.n self n n self.parents=[-1]*n self.parents self parents [-1]*n [-1] -1 n self self n n def find(self,x):
        #グループの根を返す
        if self.parents[x]<0:return x
        else:
            self.parents[x]=self.find(self.parents[x])
            return self.parents[x]
     find if self.parents[x]<0:return x
        else:
            self.parents[x]=self.find(self.parents[x])
            return self.parents[x]
     self.parents[x]<0 self.parents[x] self.parents self parents x 0 self.parents[x]=self.find(self.parents[x]) self.parents[x] self.parents self parents x self.find(self.parents[x]) self.find self find self.parents[x] self.parents self parents x return self.parents[x] self.parents[x] self.parents self parents x self self x x def unite(self,x,y):
        #要素x,yのグループを併合
        x,y=self.find(x),self.find(y)
        if x==y:return
        if self.parents[x]>self.parents[y]:#要素数の大きい方をxに
            x,y=y,x
        self.parents[x]+=self.parents[y]
        self.parents[y]=x #要素数が大きい方に併合
     unite x,y=self.find(x),self.find(y) x self.find(x) self.find self find x y self.find(y) self.find self find y if x==y:return
         x==y x y if self.parents[x]>self.parents[y]:#要素数の大きい方をxに
            x,y=y,x
         self.parents[x]>self.parents[y] self.parents[x] self.parents self parents x self.parents[y] self.parents self parents y x,y=y,x x y y x self.parents[x]+=self.parents[y] self.parents[x] self.parents self parents x self.parents[y] self.parents self parents y self.parents[y]=x self.parents[y] self.parents self parents y x self self x x y y def size(self,x):
        #xが属するグループの要素数
        return -self.parents[self.find(x)]
     size return -self.parents[self.find(x)] -self.parents[self.find(x)] self.parents[self.find(x)] self.parents self parents self.find(x) self.find self find x self self x x def same(self,x,y):
        #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 main():
    n,m=map(int,input().split())
    AB=[tuple(map(int,input().split())) for i in range(m)]
    ANS=[0]*(m+1)
    ANS[0]=n*(n-1)//2
    uf=UnionFind(n)
    i=0
    for a,b in AB[::-1]:
        a-=1
        b-=1
        if uf.same(a,b):
            ANS[i+1]=ANS[i]
        else:
            na=uf.size(a)
            nb=uf.size(b)
            ANS[i+1]=ANS[i]-na*nb
            uf.unite(a,b)
        i+=1
    for i in range(m):
        print(ANS[-2-i]) main n,m=map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split m tuple(map(int,input().split())) for i in range(m) for i in range(m) i range(m) range m for i in range(m) tuple(map(int,input().split())) tuple map(int,input().split()) map int input().split() ().split () input split AB=[tuple(map(int,input().split())) for i in range(m)] AB [tuple(map(int,input().split())) for i in range(m)] ANS=[0]*(m+1) ANS [0]*(m+1) [0] 0 m+1 m 1 ANS[0]=n*(n-1)//2 ANS[0] ANS 0 n*(n-1)//2 n*(n-1) n n-1 n 1 2 uf=UnionFind(n) uf UnionFind(n) UnionFind n i=0 i 0 for a,b in AB[::-1]:
        a-=1
        b-=1
        if uf.same(a,b):
            ANS[i+1]=ANS[i]
        else:
            na=uf.size(a)
            nb=uf.size(b)
            ANS[i+1]=ANS[i]-na*nb
            uf.unite(a,b)
        i+=1
     a b AB[::-1] AB ::-1 -1 a-=1 a 1 b-=1 b 1 if uf.same(a,b):
            ANS[i+1]=ANS[i]
        else:
            na=uf.size(a)
            nb=uf.size(b)
            ANS[i+1]=ANS[i]-na*nb
            uf.unite(a,b)
         uf.same(a,b) uf.same uf same a b ANS[i+1]=ANS[i] ANS[i+1] ANS i+1 i 1 ANS[i] ANS i na=uf.size(a) na uf.size(a) uf.size uf size a nb=uf.size(b) nb uf.size(b) uf.size uf size b ANS[i+1]=ANS[i]-na*nb ANS[i+1] ANS i+1 i 1 ANS[i]-na*nb ANS[i] ANS i na*nb na nb uf.unite(a,b) uf.unite uf unite a b i+=1 i 1 for i in range(m):
        print(ANS[-2-i]) i range(m) range m print(ANS[-2-i]) print ANS[-2-i] ANS -2-i -2 i if __name__=='__main__':
    main() __name__=='__main__' __name__ '__main__' main() main class UnionFind():
    def __init__(self, n):
        self.n=n
        self.parents=[-1]*n # 親(uf.find()で経路圧縮して根)の番号。根の場合は-(そのグループの要素数)
    def find(self,x):
        #グループの根を返す
        if self.parents[x]<0:return x
        else:
            self.parents[x]=self.find(self.parents[x])
            return self.parents[x]
    def unite(self,x,y):
        #要素x,yのグループを併合
        x,y=self.find(x),self.find(y)
        if x==y:return
        if self.parents[x]>self.parents[y]:#要素数の大きい方をxに
            x,y=y,x
        self.parents[x]+=self.parents[y]
        self.parents[y]=x #要素数が大きい方に併合
    def size(self,x):
        #xが属するグループの要素数
        return -self.parents[self.find(x)]
    def same(self,x,y):
        #xとyが同じグループ？
        return self.find(x)==self.find(y) class UnionFind():
    def __init__(self, n):
        self.n=n
        self.parents=[-1]*n # 親(uf.find()で経路圧縮して根)の番号。根の場合は-(そのグループの要素数)
    def find(self,x):
        #グループの根を返す
        if self.parents[x]<0:return x
        else:
            self.parents[x]=self.find(self.parents[x])
            return self.parents[x]
    def unite(self,x,y):
        #要素x,yのグループを併合
        x,y=self.find(x),self.find(y)
        if x==y:return
        if self.parents[x]>self.parents[y]:#要素数の大きい方をxに
            x,y=y,x
        self.parents[x]+=self.parents[y]
        self.parents[y]=x #要素数が大きい方に併合
    def size(self,x):
        #xが属するグループの要素数
        return -self.parents[self.find(x)]
    def same(self,x,y):
        #xとyが同じグループ？
        return self.find(x)==self.find(y) UnionFind def input(): return sys.stdin.readline().rstrip() def input(): return sys.stdin.readline().rstrip() input def main():
    n,m=map(int,input().split())
    AB=[tuple(map(int,input().split())) for i in range(m)]
    ANS=[0]*(m+1)
    ANS[0]=n*(n-1)//2
    uf=UnionFind(n)
    i=0
    for a,b in AB[::-1]:
        a-=1
        b-=1
        if uf.same(a,b):
            ANS[i+1]=ANS[i]
        else:
            na=uf.size(a)
            nb=uf.size(b)
            ANS[i+1]=ANS[i]-na*nb
            uf.unite(a,b)
        i+=1
    for i in range(m):
        print(ANS[-2-i]) def main():
    n,m=map(int,input().split())
    AB=[tuple(map(int,input().split())) for i in range(m)]
    ANS=[0]*(m+1)
    ANS[0]=n*(n-1)//2
    uf=UnionFind(n)
    i=0
    for a,b in AB[::-1]:
        a-=1
        b-=1
        if uf.same(a,b):
            ANS[i+1]=ANS[i]
        else:
            na=uf.size(a)
            nb=uf.size(b)
            ANS[i+1]=ANS[i]-na*nb
            uf.unite(a,b)
        i+=1
    for i in range(m):
        print(ANS[-2-i]) main
import sys
def input(): return sys.stdin.readline().rstrip()
class UnionFind():
    def __init__(self, n):
        self.n=n
        self.parents=[-1]*n # 親(uf.find()で経路圧縮して根)の番号。根の場合は-(そのグループの要素数)
    def find(self,x):
        #グループの根を返す
        if self.parents[x]<0:return x
        else:
            self.parents[x]=self.find(self.parents[x])
            return self.parents[x]
    def unite(self,x,y):
        #要素x,yのグループを併合
        x,y=self.find(x),self.find(y)
        if x==y:return
        if self.parents[x]>self.parents[y]:#要素数の大きい方をxに
            x,y=y,x
        self.parents[x]+=self.parents[y]
        self.parents[y]=x #要素数が大きい方に併合
    def size(self,x):
        #xが属するグループの要素数
        return -self.parents[self.find(x)]
    def same(self,x,y):
        #xとyが同じグループ？
        return self.find(x)==self.find(y)
def main():
    n,m=map(int,input().split())
    AB=[tuple(map(int,input().split())) for i in range(m)]
    ANS=[0]*(m+1)
    ANS[0]=n*(n-1)//2
    uf=UnionFind(n)
    i=0
    for a,b in AB[::-1]:
        a-=1
        b-=1
        if uf.same(a,b):
            ANS[i+1]=ANS[i]
        else:
            na=uf.size(a)
            nb=uf.size(b)
            ANS[i+1]=ANS[i]-na*nb
            uf.unite(a,b)
        i+=1
    for i in range(m):
        print(ANS[-2-i])


if __name__=='__main__':
    main()