Problem:
Problem B: GPA JANKEN

Problem

GPAとは「Galaxy Point of Aizu」の略で、0から4までの実数値を取る。

GPAじゃんけんは二人で行うゲームである。各々が「じゃんけん、ぽん（ほい）」の合図で互いにグー、チョキ、パーのどれか好きな手を出した後、GPAが高い人が勝者となり、低い人が敗者となる。同じ場合は引き分けとなる。

N 人のGPAのデータが与えられるので、総当たり戦をした時のそれぞれの勝ち点を出力せよ。

ただし、勝ち点は勝ちの時3、引き分けの時1、負けの時0とする。

総当たり戦とはすべての参加者が自分以外の参加者と丁度一回ずつ対戦する方式である。

Input

入力は以下の形式で与えられる。

N
a1
a2
...
aN

一行目にGPAじゃんけんをする人数 N が与えられる。

続く N 行に i 番目の人のGPAのデータ ai が一行に与えられる。

Constraints

入力は以下の条件を満たす。

2 ≤ N ≤ 105

N は整数

0.000 ≤ ai ≤ 4.000 ( 1 ≤ i ≤ N )

ai は実数 ( 1 ≤ i ≤ N )

各GPAは小数点以下3桁まで与えられる

Output

i 行目に i 番目の人の勝ち点を一行に出力せよ。
( 1 ≤ i ≤ N )

Sample Input 1

3
1.000
3.000
3.000

Sample Output 1

0
4
4

Sample Input 2

3
1.000
2.000
3.000

Sample Output 2

0
3
6

Solution in C (judge verdict: Accepted)

/*
A3001.c
*/

#include <stdio.h>
#include <stdlib.h>
int n;
struct jk_st
{
  double gpa;
  int point;
  int order;
} data[100000];
  
int compA( const void * a , const void * b ) {

  if( ((struct jk_st * )a)->gpa > ((struct jk_st * )b)->gpa)
    return -1;

  else
    if( ((struct jk_st * )a)->gpa == ((struct jk_st * )b)->gpa)
    return 0;
  
  return 1;
}
int compB( const void * a , const void * b ) {

  if( ((struct jk_st * )a)->order < ((struct jk_st * )b)->order)
    return -1;

  else
    if( ((struct jk_st * )a)->order == ((struct jk_st * )b)->order)
    return 0;
  
  return 1;
}


void solve()
{
  int i,j,acc,same,pt;
  double prev;
  prev=data[0].gpa;same=1;
  acc=1;
  for(i=1,acc=0;i<=n;i++)
    {
      if(i==n || data[i].gpa!=prev)
      {
	acc += same;
	pt =(n-acc)*3+(same-1);

	for(j=1;j<=same;j++)
	  data[i-j].point=pt;
	same=1;
      }
      else
      	same++;
      

      prev=data[i].gpa;
      //printf("i=%d same=%d\n",i,same);
    }
}

void dump()
{ int i;
  for(i=n-1;i>=n-30;i--)
    printf("%d:%lf[%d][%d]\n",i,data[i].gpa,data[i].point,data[i].order);
}
void output()
{ int i;
  for(i=0;i<n;i++)
    printf("%d\n",data[i].point);
}

int main()
{
  int i;
  scanf("%d",&n);
  for(i=0;i<n;i++)
    {
      scanf("%lf",&(data[i].gpa));
      data[i].order=i;
    }
  qsort(data,n,sizeof(struct jk_st),compA);
  
  solve();
  //dump();  
  qsort(data,n,sizeof(struct jk_st),compB);

  output();
  return(0);
}