Problem:
Score : 1200 points

Problem Statement

You are given a permutation of 1,2,...,N: p_1,p_2,...,p_N. Determine if the state where p_i=i for every i can be reached by performing the following operation any number of times:

Choose three elements p_{i-1},p_{i},p_{i+1} (2\leq i\leq N-1) such that p_{i-1}>p_{i}>p_{i+1} and reverse the order of these three.

Constraints

3 \leq N \leq 3 × 10^5

p_1,p_2,...,p_N is a permutation of 1,2,...,N.

Input

Input is given from Standard Input in the following format:

N
p_1
:
p_N

Output

If the state where p_i=i for every i can be reached by performing the operation, print Yes; otherwise, print No.

Sample Input 1

5
5
2
1
4
3

Sample Output 1

Yes

The state where p_i=i for every i can be reached as follows:

Reverse the order of p_1,p_2,p_3. The sequence p becomes 1,2,5,4,3.

Reverse the order of p_3,p_4,p_5. The sequence p becomes 1,2,3,4,5.

Sample Input 2

4
3
2
4
1

Sample Output 2

No

Sample Input 3

7
3
2
1
6
5
4
7

Sample Output 3

Yes

Sample Input 4

6
5
3
4
1
2
6

Sample Output 4

No

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

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 300010;

int n, a[MAXN];

bool Check(int l, int r)
{
	int mn = MAXN, mx = 0;
	for(int i = l; i <= r; ++i)
	{
		mn = min(mn, a[i]);
		mx = max(mx, a[i]);
	}
	if(mn != l || mx != r) return 0;
	int x = 0, y = 0;
	for(int i = l; i <= r - 2; i += 2)
	{
		if(a[i] > i)
		{
			if(a[i] > x) x = a[i];
			else return 0;
		}
		else if(a[i] < i)
		{
			if(a[i] > y) y = a[i];
			else return 0;
		}
		else return 0;
	}
	return 1;
}

int main()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	for(int i = 1; i <= n - 2; i += 2)
	{
		if(a[i] == i) continue;
		int j = i;
		while(j <= n - 2)
		{
			if(a[j + 1] != j + 1) break;
			if(a[j + 2] == j + 2) break;
			j += 2;
		}
		if(j == i || !Check(i, j))
		{
			puts("No");
			return 0;
		}
		i = j;
	}
	puts("Yes");
	return 0;
}