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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Linq;//リストの使用
using System.Collections.Generic;
using System.Text;//テキストの高速出力に必要
class Program
{
static long n = long.Parse(Console.ReadLine());
static long[] numsSub = new long[n];
static long[] bits = new long[n+1];

	static void Main()
	{
    long[][] nums = new long[n][];//値、位置、奇数番目の値、偶数番目の値
    
		for(int i = 0; i < n; i++)
    {
      nums[i] = new long[10];
      nums[i][0] = long.Parse(Console.ReadLine());
      nums[i][1] = i;
    }
    Array.Sort(nums, (a, b) => a[0].CompareTo(b[0]));//ソート
    for(int i = 0; i < n; i++)
    {
      nums[i][0] = i+1;//値を1~nで置き換え
      if(nums[i][1] % 2 == 0)
      {
        nums[i][2] = i+1;
        nums[i][3] = 99999999999;
      }else
      {
        nums[i][2] = 99999999999;
        nums[i][3] = i+1;        
      }
    }
    Array.Sort(nums, (a, b) => a[2].CompareTo(b[2]));
    for(int i = 0; i <= n/2; i++) nums[i][1] = 2*i;
    
    Array.Sort(nums, (a, b) => a[3].CompareTo(b[3]));
    for(int i = 0; i < (n+1)/2; i++) nums[i][1] = 2*i+1;

    Array.Sort(nums, (a, b) => a[1].CompareTo(b[1]));
    for(int i = 0; i < n; i++) numsSub[i] = nums[i][0];
    
    long answer = 0;
    for(long i = 0; i < n; i++)
    {
      answer += i - BitSum(numsSub[i]);
      BitAdd(numsSub[i], 1);
    }
    Console.WriteLine(answer);
	}

  static void BitAdd(long i, long x)//BITでiだけにx加算
  {
    while(i <= n)
    {
      bits[i] += x;
      i += i&-i;
    }
  }

  static long BitSum(long i)//BITでi以下の総和を計算
  {
    long sum = 0;
    while(i > 0)
    {
      sum += bits[i];
      i -= i&-i;
    }
    return sum;
  }
  
}