Problem:
Score : 400 points

Problem Statement

We have N balls. The i-th ball has an integer A_i written on it.

For each k=1, 2, ..., N, solve the following problem and print the answer.

Find the number of ways to choose two distinct balls (disregarding order) from the N-1 balls other than the k-th ball so that the integers written on them are equal.

Constraints

3 \leq N \leq 2 \times 10^5

1 \leq A_i \leq N

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

For each k=1,2,...,N, print a line containing the answer.

Sample Input 1

5
1 1 2 1 2

Sample Output 1

2
2
3
2
3

Consider the case k=1 for example. The numbers written on the remaining balls are 1,2,1,2.

From these balls, there are two ways to choose two distinct balls so that the integers written on them are equal.

Thus, the answer for k=1 is 2.

Sample Input 2

4
1 2 3 4

Sample Output 2

0
0
0
0

No two balls have equal numbers written on them.

Sample Input 3

5
3 3 3 3 3

Sample Output 3

6
6
6
6
6

Any two balls have equal numbers written on them.

Sample Input 4

8
1 2 1 4 2 1 4 1

Sample Output 4

5
7
5
7
7
5
7
5

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Numerics;
using System.IO;
using static System.Math;
using static Math2;
using static io;
using static utils;


class Program
{
    static void Main(string[] args)
    {
        var wrong_answer = new wrong_answer();
        wrong_answer.Solve();
    }
}

public class wrong_answer
{
    const int INF = 1 << 29;
    const long INFL = 1L << 60;
    const int MOD = 1000000007;
    const int MOD2 = 998244353;


    public void Solve()
    {
        var n = int1;
        var a = intm;
        var tot = new long[n + 1];
        for (int i = 0; i < n; ++i)
        {
            tot[a[i] - 1]++;
        }
        var pre = new long[n + 1];
        var suf = new long[n + 1];
        var r = new long[n];
        for (int i = 0; i < n; ++i)
        {
            pre[i + 1] = pre[i] + tot[i] * (tot[i] - 1) / 2;
            r[i] = (tot[i] - 1) * (tot[i] - 2) / 2;
        }
        for (int i = n - 1; i >= 0; --i)
        {
            suf[i] = suf[i + 1] + (tot[i] - 1) * tot[i] / 2;
        }
        var ans = new long[n + 1];
        for (int i = 0; i < n; ++i)
        {
            ans[i] = pre[i] + r[i] + suf[i + 1];
        }
        for (int i = 0; i < n; ++i)
        {
            write(ans[a[i] - 1]);
        }
    }


}


public class Factorical
{
    public long[] fact;
    public long[] invfact;
    public void factoricalmodset(long N, long MOD = 1000000007)
    {
        fact = new long[N + 1];
        invfact = new long[N + 1];
        fact[0] = 1;

        for (long i = 1; i <= N; ++i)
        {
            fact[i] = fact[i - 1] * i % MOD;
        }
        invfact[N] = pow(fact[N], MOD - 2);

        for (long i = N; i > 0; --i)
        {
            invfact[i - 1] = invfact[i] * i % MOD;
        }

    }

    public long nCr(long n, long r, long MOD = 1000000007)
    {
        return (fact[n] * invfact[r] % MOD * invfact[n - r] % MOD);
    }
}

public static class utils
{
    public static void swap<T>(ref T a, ref T b)
    {
        T x = a;
        a = b;
        b = x;
    }
    public static int digitsum(int n)
    {
        string s = n.ToString();
        int ret = 0;
        for (int i = 0; i < s.Length; ++i) ret += s[i] - '0';
        return ret;
    }
    public static int[] zaaku(long[] a)
    {
        var dic = new Dictionary<long, int>();
        long[] ar = new long[a.Length];
        a.CopyTo(ar, 0);
        Array.Sort(ar);
        int z = 0;
        foreach (var x in ar)
        {
            if (!dic.ContainsKey(x))
                dic[x] = z++;
        }
        return a.Select(c => dic[c]).ToArray();
    }

    public static int[] retranking(long[] A)
    {
        var dic = new Dictionary<long, int>();
        A.OrderByDescending(_ => _).Where(w => !dic.ContainsKey(w)).Select((x, i) => dic[x] = i + 1).ToList();
        return A.Select(i => dic[i]).ToArray();
    }
    public static List<Tuple<T, int>> compress<T>(T[] A) where T : IComparable
    {
        int i = 0;
        var ret = new List<Tuple<T, int>>();
        while (i < A.Length)
        {
            T x = A[i];
            int num = 0;
            while (i < A.Length && x.CompareTo(A[i]) == 0)
            {
                num++;
                i++;
            }
            ret.Add(new Tuple<T, int>(x, num));
        }
        return ret;
    }
}

public static class Math2
{
    public static long pow(long i, long n, long MOD = 1000000007)
    {
        long res = 1;
        while (n > 0)
        {
            if ((n & 1) != 0) res = res * i % MOD;
            i = i * i % MOD;
            n >>= 1;
        }
        return res;
    }
    public static int pow(int i, int n, int MOD = 1000000007)
    {
        int res = 1;
        while (n > 0)
        {
            if ((n & 1) != 0) res = res * i % MOD;
            i = i * i % MOD;
            n >>= 1;
        }
        return res;
    }

    public static long gcd(long i, long y)
    {
        while (y != 0)
        {
            var r = i % y;
            i = y;
            y = r;
        }
        return i;
    }

    public static long lcm(long i, long y)
    {
        return i * y / gcd(i, y);
    }


    public static Dictionary<long, int> primefactorization(long N)
    {

        var ret = new Dictionary<long, int>();

        for (long i = 2; i * i <= N; ++i)
        {
            int cnt = 0;
            while (N % i == 0)
            {
                cnt++;
                N /= i;
            }
            if (cnt != 0) ret[i] = cnt;

        }
        if (N >= 2) ret[N] = 1;

        return ret;

    }

    public static List<long> divisorenumrate(long N)
    {
        var ret = new List<long>();

        for (long i = 1; i * i <= N; ++i)
        {

            if (N % i == 0)
            {
                ret.Add(i);
                ret.Add(N / i);
            }

        }

        return ret;

    }

    public static void swap<T>(ref T a, ref T b)
    {
        var i = a;
        a = b;
        b = i;
    }
    public static void chmin<T>(ref T a, T b) where T : IComparable
    {
        if (a.CompareTo(b) > 0) a = b;
    }
    public static void chmax<T>(ref T a, T b) where T : IComparable
    {
        if (a.CompareTo(b) < 0) a = b;
    }

}

public static class io
{
    //in
    public static string str => Console.ReadLine();

    public static string[] strm => str.Split(' ');

    public static long[] longm => strm.Select(long.Parse).ToArray();
    public static int[] intm => strm.Select(int.Parse).ToArray();
    public static char[] charm => str.ToArray();
    public static double[] doublem => strm.Select(double.Parse).ToArray();
    public static long long1 => longm[0];
    public static int int1 => intm[0];
    public static char char1 => charm[0];
    public static double double1 => doublem[0];
    public static long[] horizontalread(int N) { long[] A = new long[N]; for (int i = 0; i < N; ++i) A[i] = long1; return A; }
    public static void write(string a) => Console.WriteLine(a);
    public static void write(params object[] i) => write(string.Join(" ", i));
    public static void write<T>(IEnumerable<T> a) => write(string.Join(" ", a));
    public static void horizontalwrite<T>(IEnumerable<T> a) { foreach (var z in a) write(z); }
    public static void yn(bool i) { if (i) write("Yes"); else write("No"); }

}