Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

The Number of Inversions

For a given sequence $A = \{a_0, a_1, ... a_{n-1}\}$, the number of pairs $(i, j)$ where $a_i > a_j$ and $i < j$, is called the number of inversions. The number of inversions is equal to the number of swaps of Bubble Sort defined in the following program:

bubbleSort(A)
cnt = 0 // the number of inversions
for i = 0 to A.length-1
for j = A.length-1 downto i+1
if A[j] < A[j-1]
swap(A[j], A[j-1])
cnt++

return cnt

For the given sequence $A$, print the number of inversions of $A$. Note that you should not use the above program, which brings Time Limit Exceeded.

Input

In the first line, an integer $n$, the number of elements in $A$, is given. In the second line, the elements $a_i$ ($i = 0, 1, .. n-1$) are given separated by space characters.

output

Print the number of inversions in a line.

Constraints

$ 1 \leq n \leq 200,000$

$ 0 \leq a_i \leq 10^9$

$a_i$ are all different

Sample Input 1

5
3 5 2 1 4

Sample Output 1

6

Sample Input 2

3
3 1 2

Sample Output 2

2

Solution in Scala (judge verdict: Wrong Answer)

import scala.io.StdIn.{readInt, readLine}
object Main {
    def main(args: Array[String]): Unit = {
        val len = readInt
        val arr = readLine.split(" ").map(_.toInt)
        println(mergeSort(arr, 0, len - 1))
    }
    def mergeSort(arr: Array[Int], left: Int, right: Int): Int = {
        if (left < right) {
            val mid = (right + left) / 2
            val r1 = mergeSort(arr, left, mid)
            val r2 = mergeSort(arr, mid + 1, right)
            val r3 = merge(arr, left, mid, right)
            r1 + r2 + r3
        } else {
            0
        }
    }
    def merge(arr: Array[Int], left: Int, mid: Int, right: Int): Int = {
        var reverse = 0
        val tmp = arr.slice(left, mid + 1) // 左側を一時配列にコピー
        var leftPtr = 0
        var rightPtr = mid + 1
        for (i <- (left to right)) {
            if (leftPtr >= tmp.length) {
                // 左側を使い切った場合 : 交換の必要なし
                rightPtr += 1
            } else if (rightPtr  > right) {
                // 右側を使い切った場合
                arr(i) = tmp(leftPtr)
                leftPtr += 1
            } else {
                if (arr(rightPtr) < tmp(leftPtr)){
                    arr(i) = arr(rightPtr)
                    rightPtr += 1
                    reverse += tmp.length - leftPtr
                } else {
                    arr(i) = tmp(leftPtr)
                    leftPtr += 1
                }
            }
        }
        reverse
    }
}