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 Scala (judge verdict: Runtime Error)

import java.util.Scanner

import scala.annotation.tailrec

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(new Node(None, 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  @tailrec
  private def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) => root(p)
  }
}

object Main {
  def solve(sc: => Scanner): Unit = {
    val A = Array.fill(sc.nextInt)(sc.nextDouble)
    for (i <- 0 until A.size) {
      println(A.map(x => if (A(i) < x) (0) else (if (A(i) == x) (1) else (3))).sum - 1)
    }
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)

    solve(sc)
  }
}