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

#include <stdio.h>
#include <string.h>
#include <math.h>



#define SENT 1000000000


int merge(int A[], int first, int mid, int last, int* ans){
    
    int i,j,k, former, latter, *L, *R, cmp;
    cmp = 0;
    
    
    former = mid - first + 1;
    latter = last - mid;
    
    L = (int*)malloc(sizeof(int) * (former+1));
    R = (int*)malloc(sizeof(int) * (latter+1));
    
    for (i=0; i < former; i++) {
        L[i] = A[first + i];
    }
    L[former] = SENT;
    
    for (i=0; i < latter; i++) {
        R[i] = A[i + mid + 1];
    }
    R[latter] = SENT;
    
    j=k=0;
    for (i = first; i < last + 1; i++) {
        if (L[j] <= R[k]) {
            A[i] = L[j];
            j++;
        }
        else
        {
            A[i] = R[k];
            k++;
            (*ans) += (former - j);
        }
        cmp += 1;
    }
    return cmp;
    
}

int MergeSort(int A[], int first, int last, int *ans){
    
    int cmp, mid;
    cmp = 0;
    
    if (first < last) {
        mid = (first + last)/2;
        cmp += MergeSort(A, first, mid, ans);
        cmp += MergeSort(A, mid+1, last, ans);
        cmp += merge(A, first, mid, last, ans);
    }
    
    return cmp;
}

int main( ){
    
    int i, n, ans = 0;
    
    scanf("%d", &n);
    int A[n];
    
    
    for (i=0; i<n; i++) {
        scanf("%d", &A[i]);
    }
    
    MergeSort(A, 0, n-1, &ans);
    
    printf("%d\n", ans);
    
    
    return 0;
}