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 Haskell (GHC 7.10.3) (judge verdict: Accepted)

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TypeFamilies #-}
import           Data.Maybe
import           Data.Int
import           Data.List
import           Data.Char
  -- import qualified Data.Vector.Unboxing as VU
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as VM
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Unboxed.Mutable as VUM
import qualified Data.ByteString.Char8 as BS
import           Data.List (scanl')
import           Data.IORef
import           Control.Monad
import           Control.Monad.ST
import           Control.Monad.State.Strict
import           Control.Applicative
import           Debug.Trace
import           Text.Printf


readInt = BS.readInt . BS.dropWhile isSpace
getVector f = VU.unfoldr f <$> BS.getLine
getIntVector = getVector readInt
getBSVector = getVector BS.uncons

main = do
  n <- readLn :: IO Int
  as <- map read . words <$> getLine :: IO [Int]

  -- ansPrint n as
  modelAnswer n as

solve k as = solver as
  where
    as' = delete k as


comb x y = (loop1 x y 1) `div` (loop2 y 1)
  where
    loop1 _ 0 n' = n'
    loop1 n r n' = loop1 (n-1) (r-1) (n*n')
    loop2 0 n' = n'
    loop2 n n' = loop2 (n-1) (n*n')

comb' x = if x <= 0 then 0 else comb x 2


solver as = foldl' (\n m -> (+) n $ comb' . length $ m ) 0 $ group as

dpaNumber :: Int -> [Int] -> VU.Vector Int
dpaNumber n as = VU.create $ do
  dp <- VUM.replicate (n+1) 0

  forM_ as $ \a -> do
    VUM.modify dp (\n -> n+1) a

  return dp

ansPrint n as = do
  let as' = VU.fromList $ 0:as
      aNumber = dpaNumber n as
      aComb = VU.map comb' aNumber
      aCombExclude = VU.map (\n -> (comb' $ n-1)) aNumber

  forM_ [1..n] $ \i -> do
    let k = as' VU.! i
        aExclude = aCombExclude VU.! k
        ans = (\(n,m) -> aExclude + VU.sum n + (VU.sum $ VU.tail m))  $ VU.splitAt k aComb
    print ans

modelAnswer n as = do
  let aNumber = dpaNumber n as
      aSumCombination = VU.foldl' (\n m -> n + (comb' m)) 0 $ aNumber


  forM_ as $ \a -> do
    let aNum = aNumber VU.! a
    print $ aSumCombination - ((comb' aNum) - (comb' $ aNum-1))