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>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
 
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef unsigned long long ull;
typedef long double ld; 
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;

int a[333333];

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	int n; cin>>n;
	for(int i=0;i<n;i++) 
	{
		cin>>a[i]; a[i]--;
	}
	int mx=-1; bool dir=0; //dir=1 => all look left 
	for(int i=0;i<n;i++)
	{
		if(a[i]==i) 
		{
			if(mx!=-1){cout<<"No\n"; return 0;}
			continue;
		}
		if(mx==-1)
		{
			mx=a[i];
			assert(a[i]>i);
			if(a[i+1]!=i+1){cout<<"No\n"; return 0;}
			i++;
		}
		else
		{
			if(a[i]>i)
			{
				if(dir){cout<<"No\n"; return 0;}
				if(a[i]<mx){cout<<"No\n"; return 0;}
				mx=a[i];
				if(a[i+1]!=i+1){cout<<"No\n"; return 0;}
				i++;
			}
			else
			{
				if(a[i-2]<i-2&&a[i-2]>a[i]){cout<<"No\n"; return 0;}
				dir=1;
				if(mx==i)
				{
					dir=0; mx=-1;
				}
				else
				{
					if(a[i+1]!=i+1){cout<<"No\n"; return 0;}
					i++;
				}
			}
		}
	}
	if(mx!=-1){cout<<"No\n"; return 0;}
	cout<<"Yes\n";
}