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 JAVA (judge verdict: Wrong Answer)

public class Main{
  public void run(java.io.InputStream in, java.io.PrintStream out){
    java.util.Scanner sc = new java.util.Scanner(in);
    int n, i;
    int[] a;
    n = sc.nextInt();
    a = new int[n];
    for(i = 0;i < n;i++)a[i] = sc.nextInt();
    out.println(count(a, 0, n));

    sc.close();
  }
  private static int count(int[] c, int l, int r){
    int m;
    if(l + 1 >= r){
      if(l < r)return 0;
      return 1;
    }else{
      m = (l + r) / 2;
      return (count(c, l, m) + count(c, m, r) + merge(c, l, m, r));
    }
  }
  private static int merge(int[] c, int l, int m, int r){
    int nl, nr;
    int i, j, k, count;
    int infi = 1980000000;
    int[] cl, cr;
    nl = m - l; nr = r - m;
    cl = new int[nl + 1]; cr = new int[nr + 1];
    for(i = 0;i < nl;i++)cl[i] = c[l + i];
    for(i = 0;i < nr;i++)cr[i] = c[m + i];
    cl[nl] = infi; cr[nr] = infi;
    i = 0; j = 0; count = 0;
    for(k = l;k < r;k++){
      if(cl[i] < cr[j])c[k] = cl[i++];
      else{
        c[k] = cr[j++]; count += (nl - i);
      }
    }
    return count;
  }
  public static void main(String[] args){
    (new Main()).run(System.in, System.out);
  }
}