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)

using System;
using System.Collections.Generic;

namespace Project
{
	class MainClass
	{
		public static int count = 0;

		public static void Main(string[] args)
		{
			int n = int.Parse(Console.ReadLine());
			int[] a = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
			MergeSort(a, 0, n);
			Console.WriteLine(count);
		}

		public static void Merge(int[] A, int left, int mid, int right)
		{
			int n1 = mid - left;
			int n2 = right - mid;
			int[] L = new int[n1 + 1];
			int[] R = new int[n2 + 1];
			for (int l = 0; l < n1; l++)
			{
				L[l] = A[left + l];
			}
			for (int l = 0; l < n2; l++)
			{
				R[l] = A[mid + l];
			}
			L[n1] = int.MaxValue;
			R[n2] = int.MaxValue;
			int i = 0;
			int j = 0;
			for (int k = left; k < right; k++)
			{
				if (L[i] <= R[j])
				{
					A[k] = L[i];
					i++;

				}
				else
				{
					A[k] = R[j];
					count += n1 - i;
					j++;
				}
			}
		}

		public static void MergeSort(int[] A, int left, int right)
		{
			if (left + 1 < right)
			{
				int mid = (left + right) / 2;
				MergeSort(A, left, mid);
				MergeSort(A, mid, right);
				Merge(A, left, mid, right);
			}
		}
	}
}