using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
            // 入力
            string[] sS = System.Console.ReadLine().Trim().Split(' ');
            int iN = int.Parse(sS[0]);
            sS = System.Console.ReadLine().Trim().Split(' ');
            List<int> lstInp = new List<int>();
            for (int i = 0; i < sS.Length; i++) { lstInp.Add(int.Parse(sS[i])); }
            //// Debug 入力
            //List<int> lstInp = new List<int>();
            //for (int i = 1; i <= 2 * 100000 - 2; i++) { lstInp.Add(i); }
            //for (int i = 0; i < 2; i++) { lstInp.Add(2 * 100000 - 1); }
            ////for (int i = 1; i <= 2; i++)
            ////{
            ////    for (int j = 1; j <= 1000; j++)
            ////    {
            ////        for (int k = 1; k <= 100; k++)
            ////        {
            ////            lstInp.Add(i * j);
            ////        }
            ////    }
            ////}

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            // 解析
            Dictionary<int, int> dicCnt = new Dictionary<int, int>();
            for (int i = 0; i < lstInp.Count; i++)
            {
                if (dicCnt.ContainsKey(lstInp[i])) { dicCnt[lstInp[i]] += 1; }                              // 数値毎の数+1
                else { dicCnt.Add(lstInp[i], 1); }                                                          // その数値初めては1
            }
            Dictionary<int, long> dicCmbN = new Dictionary<int, long>();
            Dictionary<int, long> dicCmbM = new Dictionary<int, long>();
            foreach (KeyValuePair<int, int> kvp in dicCnt)                                                  // 数値毎の数からその数よる組み合わせ数取得
            {
                dicCmbN.Add(kvp.Key, (long)(kvp.Value - 0) * (long)(kvp.Value - 1) / 2L);                   // 各値の-0個の組み合わせ数
                dicCmbM.Add(kvp.Key, (long)(kvp.Value - 1) * (long)(kvp.Value - 2) / 2L);                   // 各値の-1個の組み合わせ数
            } 
            long iSum = 0L;
            foreach (KeyValuePair<int, long> kvp in dicCmbN) { iSum += kvp.Value; }                         // 各値の-0個の組み合わせ数の全部の合計
            Dictionary<int, long> dicOth = new Dictionary<int, long>();
            foreach (KeyValuePair<int, long> kvp in dicCmbN) { dicOth.Add(kvp.Key, iSum - kvp.Value); }     // 各値の自分以外の値の組み合わせ数の合計(全部の合計-自分の組み合わせ数)

            // 出力
            for (int i = 0; i < lstInp.Count; i++)
            {
                System.Console.WriteLine("{0}", (dicOth[lstInp[i]] + dicCmbM[lstInp[i]]).ToString());       // 自分以外の値の組み合わせ数に自分の-1個の組み合わせ数を足したものが出力
            }
            //// Debug出力
            //for (int i = 0; i < 10; i++)
            //{
            //    System.Console.WriteLine("{0}", (dicOth[lstInp[i]] + dicCmbM[lstInp[i]]).ToString());
            //}
            //for (int i = lstInp.Count - 10; i < lstInp.Count; i++)
            //{
            //    System.Console.WriteLine("{0}", (dicOth[lstInp[i]] + dicCmbM[lstInp[i]]).ToString());
            //}
            //System.Console.WriteLine("dicOth.Count={0}", dicOth.Count.ToString().Trim());

            sw.Stop();
#if DEBUG
            Console.WriteLine();
            Console.WriteLine("{0}", sw.Elapsed.ToString());
            Console.WriteLine("続行するには何かキーを押してください．．．");
            Console.ReadKey();
#endif
    }

}


Measured memory_bytes: 51316