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: Time Limit Exceeded)

#include <stdio.h>
#include <time.h>

void compare(int a,int N,int A[],int k,int B[],int C[],int b_tail,int c_tail)
{
  if(a==N-1)
    {
      printf("%d",k);
      return ;
    }

  int j,bt=b_tail,ct=c_tail;

  /*C[]??????B[]??????????§?????????????*/
  if(A[a+1]>A[a])
    {
      for(j=ct;j>=1;j--)
	{
	  if(C[j]<A[a+1] || C[j]==A[a+1])
	    {
	      if(C[j]<A[a+1])
		{
		  B[++b_tail]=C[j];
		}
	      C[j]=C[c_tail];
	      c_tail--;
	    }
	}
    }

  /*B[]??????C[]??????????§?????????????*/
  else
    {
      for(j=bt;j>=1;j--)
	{
	  if(B[j]>A[a+1] || B[j]==A[a+1])
	    {
	      if(B[j]>A[a+1])
		{
		  C[++c_tail]=B[j];
		}
	      B[j]=B[b_tail];
	      b_tail--;
	    }
	}
    }

  k+=b_tail;
  a++;
  compare(a,N,A,k,B,C,b_tail,c_tail);
}




int main(void)
{
  clock_t start,end;

  /*??\?????????????????°*/
  int N;
  scanf("%d",&N);
  int A[N];

  int i,k=0;

  /*A[]?????°??????????´?*/
  for(i=0;i<N;i++)
    {
      scanf("%d",&A[i]);
    }

  start=clock();

  /*???????????°???????????????????°?????????°??????B[]????????§????????°??????C[]???*/
  int B[N],C[N];
  int b_tail=0,c_tail=0;
  for(i=1;i<N;i++)
    {
      if(A[0]>A[i])
	{
	  B[++b_tail]=A[i];
	}

      else
	{
	  C[++c_tail]=A[i];
	}
    }

  k=b_tail;
  compare(0,N,A,k,B,C,b_tail,c_tail);
  printf("\n");

  end=clock();


  return 0;
}