Problem:
Score : 600 points

Problem Statement

Snuke got an integer sequence of length N from his mother, as a birthday present. The i-th (1 ≦ i ≦ N) element of the sequence is a_i. The elements are pairwise distinct.
He is sorting this sequence in increasing order.
With supernatural power, he can perform the following two operations on the sequence in any order:

Operation 1: choose 2 consecutive elements, then reverse the order of those elements.

Operation 2: choose 3 consecutive elements, then reverse the order of those elements.

Snuke likes Operation 2, but not Operation 1. Find the minimum number of Operation 1 that he has to perform in order to sort the sequence in increasing order.

Constraints

1 ≦ N ≦ 10^5

0 ≦ A_i ≦ 10^9

If i ≠ j, then A_i ≠ A_j.

All input values are integers.

Input

The input is given from Standard Input in the following format:

N
A_1
:
A_N

Output

Print the minimum number of times Operation 1 that Snuke has to perform.

Sample Input 1

4
2
4
3
1

Sample Output 1

1

The given sequence can be sorted as follows:

First, reverse the order of the last three elements. The sequence is now: 2,1,3,4.

Then, reverse the order of the first two elements. The sequence is now: 1,2,3,4.

In this sequence of operations, Operation 1 is performed once. It is not possible to sort the sequence with less number of Operation 1, thus the answer is 1.

Sample Input 2

5
10
8
5
3
2

Sample Output 2

0

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 400005;
typedef long long ll;
int n,a[N],b[N],odd[N],even[N];
int otp, etp;
ll ans;

void merge(int l, int r){
	if(l >= r) return;
	int mid = (l+r) /2;
	merge(l, mid); 
	merge(mid+1, r);
	
	int i = l, j = mid + 1, k = l;
	while(i <= mid && j <= r){
		if(a[i] > a[j]){
			b[k++] = a[j++];
			ans += (mid - i + 1);
		} else{
			b[k++] = a[i++];
		}
	} 
	while(i <= mid) b[k++] = a[i++];
	while(j <= r) b[k++] = a[j++];
	for(int la=l;la<=r;++la)
		a[la] = b[la];
} 

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		if(i % 2 == 1) odd[++otp] = a[i];
		 else even[++etp] = a[i];
	}
	sort(odd+1,odd+otp+1);
	sort(even+1,even+etp+1);
	otp = etp = 0; 
	for(int i=1;i<=n;++i){
		if(i % 2 == 1) a[i] = odd[++otp];
		 else a[i] = even[++etp];
	} 
	merge(1, n);
	printf("%lld\n", ans);
}