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 Ruby (judge verdict: Accepted)

MAX_VALUE =10 ** 9 + 1
$count = 0

def merge(array, left, mid, right)
  array_left = array[left..mid]
  array_right = array[mid+1..right]
  array_left << MAX_VALUE
  array_right << MAX_VALUE
  l = 0
  r = 0
  sorted = []

  (right-left+1).times do 
    if (array_left[l] > array_right[r]) then
      sorted << array_right[r]
      $count += (array_left.size - 1 -l)
      r += 1
    else
      sorted << array_left[l]
      l += 1
    end
  end

  array[left, right-left+1] = sorted
end

def merge_sort(array, left, right)
  mid = (left + right) / 2
  if (right - left > 1) then
    merge_sort(array, left, mid)
    merge_sort(array, mid+1, right)
    merge(array, left, mid, right)
  elsif (right - left == 1) then
    merge(array, left, mid, right)
  end
end

n = gets.chomp.to_i
array = gets.chomp.split.map(&:to_i)
merge_sort(array, 0, n-1)
puts $count