using System;
using System.Collections.Generic;
using System.Linq;



namespace CSharpSample01
{

    class UnionFind
    {
        int[] p;
        int[] len;
        int set_num;
        //各要素が根のときの集合内の要素の数
        Dictionary<int, int> element_num;

        //コンストラクタ
        //要素数N(0～N-1)を指定
        public UnionFind(int N)
        {
            p = new int[N];
            len = new int[N];
            set_num = N;
            element_num = new Dictionary<int, int>();
            for (int i = 0; i < N; i++)
            {
                p[i] = i;
                len[i] = 0;
                element_num[i] = 1;
            }
        }

        //要素xの根を返す
        private int Root(int x)
        {
            if (p[x] == x) return x;
            return Root(p[x]);
        }

        //要素xと要素yの集合を統合
        public void Unit(int x, int y)
        {
            int root_x = Root(x);
            int root_y = Root(y);

            //同じ集合なら何もせずに返す
            if (root_x == root_y) return;

            int small;
            int big;

            if (len[root_x] < len[root_y])
            {
                small = root_x;
                big = root_y;
            }
            else
            {
                small = root_y;
                big = root_x;
            }

            //高さが同じ場合はlenを更新
            if (len[root_x] == len[root_y]) len[big]++;

            p[small] = big;
            element_num[big] += element_num[small];  //bigを根とする集合の要素数が増える
            element_num.Remove(small); //smallノードは根ではなくなるので削除         
            set_num--;  //2つの集合が1つになったので全体の集合数が1つ減る

        }

        //要素xと要素yが同じ集合に属するか
        public bool IsSame(int x, int y)
        {
            if (Root(x) == Root(y)) return true;
            else return false;
        }

        //集合の数
        public int SetNum()
        {
            return set_num;
        }

        //各集合内の要素数
        public List<int> AllSetElementNum()
        {           
            return element_num.Values.ToList();
        }

        //ノードsを含む集合の要素数
        public int ElementNum(int s)
        {
            return element_num[Root(s)];
        }
        
    }


    class Program
    {
        



        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Split(' ');
            int N = int.Parse(input[0]);
            int M = int.Parse(input[1]);

            UnionFind uf = new UnionFind(N);
            //ans[i] := M-i+1番目の橋をつなげたときの不便さ
            long[] ans = new long[M + 1];
            //1つも橋がつながっていない状態
            ans[0] = (long)N * (N - 1) / 2;
            int[] A = new int[M];
            int[] B = new int[M];
            
            for (int i = 0; i < M; i++)
            {
                input = Console.ReadLine().Split(' ');
                A[i] = int.Parse(input[0]) - 1;
                B[i] = int.Parse(input[1]) - 1;         
            }

            //M～1番目の橋を順に足していく
            for (int i = 0; i < M; i++)
            {
                int a = A[M - i - 1];
                int b = B[M - i - 1];

                if (!uf.IsSame(a, b))
                {
                    ans[i + 1] = ans[i] - (long)uf.ElementNum(a) * uf.ElementNum(b);
                }
                else
                {
                    ans[i + 1] = ans[i];
                }
                uf.Unit(a, b);
            }

            for(int i = M - 1; i >= 0; i--)
            {
                Console.WriteLine(ans[i]);
            }
        }
    }
}

Measured memory_bytes: 26564