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: Accepted)

#include<stdio.h>
#define MAX 200000
#define EMAX 1000000010

int A[MAX];
int LEFT[MAX / 2 + 2], RIGHT[MAX / 2 + 2];

long long Devide(int A[], int sp, int mid, int ep) {
	int pos_L = 0, pos_R = 0;
	long long addCount = 0;
	for (int i = 0; i < mid - sp; i++) LEFT[i] = A[sp + i];
	LEFT[mid - sp] = EMAX;
	for (int i = 0; i < ep - mid; i++) RIGHT[i] = A[mid + i];
	RIGHT[ep - mid] = EMAX;
	for (int i = 0; i < ep - sp; i++) {
		if (LEFT[pos_L] >= RIGHT[pos_R]) {
			A[sp + i] = RIGHT[pos_R];
			addCount += mid - sp - pos_L;
			pos_R++;
		}
		else if (LEFT[pos_L] < RIGHT[pos_R]) {
			A[sp + i] = LEFT[pos_L];
			pos_L++;
		}
	}
	return addCount;
}

long long countInv(int A[], int sp, int ep) {
	long long count = 0;
	if (ep - sp != 1) {
		count += countInv(A, sp, (sp + ep) / 2);
		count += countInv(A, (sp + ep) / 2, ep);
		count += Devide(A, sp, (sp + ep) / 2, ep);
	}
	return count;
}


int main() {
	int N;
	long long ans;
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		scanf("%d", &A[i]);
	}

	ans = countInv(A, 0, N);
	printf("%lld\n", ans);

	return 0;
}