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

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a)  (a).begin(),(a).end()
#define pb emplace_back
#define INF (1e9+1)
//#define INF (1LL<<59)

int solve_inversion(vector<int> &v){
    if(v.size()==1)return 0;
    
    vector<int> a(v.begin(),v.begin()+v.size()/2);
    vector<int> b(v.begin()+v.size()/2,v.end());
    
    int cnt = solve_inversion(a) + solve_inversion(b);
    
    int l=0,r=0,p=0;
    int nl = a.size(), nr = b.size();

    while(1){
        if(l==nl && r==nr)break;
        if(r==nr || (l<nl && a[l]<=b[r])){
            v[p++]=a[l++];
        }else{
            cnt+=nl-l;
            v[p++]=b[r++];
        }
    }
    
    return cnt;
}

signed main(){
    int n;
    cin>>n;
    vector<int> v(n);
    rep(i,n)scanf("%d",&v[i]);
    
    cout<<solve_inversion(v)<<endl;
}