using System;
using System.Collections.Generic;
using System.Text;
using System.Numerics;
using System.IO;


namespace SolutionCS
{
    class Program
    {
        class CountedIntUnionFind
        {
            struct ROOT
            {
                public int root;
                public int count;
            }

            // 親の要素を指す配列
            ROOT[] rootArray;

            // 初期化(最大要素数指定する)
            public CountedIntUnionFind(int max_element)
            {
                rootArray = new ROOT[max_element];
                for (int i = 0; i < rootArray.Length; i++)
                {
                    rootArray[i].root = i;       // 自分自身を指す=root
                    rootArray[i].count = 1;
                }
            }

            // 要素の根を返す
            public int Root(int element)
            {
                // 要素インデックス=親の要素インデックスなら親、そうでないなら親をたどる
                if (rootArray[element].root != element)
                {
                    // 根を取得
                    int r = Root(rootArray[element].root);
                    // 根を付け替え
                    rootArray[element].root = r;
                    // 根を返す
                    return r;
                }

                // 根を返す
                return element;
            }

            // 要素が所属している集合のカウントを返す
            public int Count(int element)
            {
                // 要素インデックス=親の要素インデックスなら親、そうでないなら親をたどる
                if (rootArray[element].root != element)
                {
                    // 根を取得
                    return Count(rootArray[element].root);
                }

                // 根のカウントを返す
                return rootArray[element].count;
            }




            // 同じ根かどうかを返す
            public bool IsSameRoot(int element1, int element2)
            {
                return (Root(element1) == Root(element2));
            }

            // 要素を結合
            public void Unite(int element1, int element2)
            {
                int root1 = Root(element1);
                int root2 = Root(element2);

                if (root1 == root2)
                {
                    return;
                }

                // 根をroot2とする
                rootArray[root1].root = root2;
                // root1のカウントを足す
                rootArray[root2].count += rootArray[root1].count;

                // root1のカウントをクリアしておく
                rootArray[root1].count = 0;
            }
        }

        static int N;
        static int M;
        static long[] v;

        struct PAIR
        {
            public int a;
            public int b;
        }

        static void Main(string[] args)
        {
            string[] s = Console.ReadLine().Split(' ');

            N = int.Parse(s[0]);
            M = int.Parse(s[1]);
            v = new long[M];
            PAIR[] p = new PAIR[M];

            for (int i = 0; i < M; i++)
            {
                s = Console.ReadLine().Split(' ');
                p[i].a = int.Parse(s[0]) - 1;
                p[i].b = int.Parse(s[1]) - 1;
            }

            CountedIntUnionFind uf = new CountedIntUnionFind(N);

            long ans = Math.BigMul(N , (N - 1)) / 2;
            for (int i = M - 1; i >= 0; i--)
            {
                v[i] = ans;

                int a = p[i].a;
                int b = p[i].b;

                if(!uf.IsSameRoot(a,b))
                {
                    int f = uf.Count(a);
                    int t = uf.Count(b);

                    ans -= Math.BigMul(f, t);

                    uf.Unite(a, b);
                }
            }

            for (int i = 0; i < M; i++)
            {
                Console.WriteLine(v[i]);
            }
        }
    }
}


Measured memory_bytes: 18504