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: Accepted)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define st static
#define cs const

inline
ll getint(){
    re ll num=0;
    re char c=gc();
    while(!isdigit(c))c=gc();
    while(isdigit(c))num=(num<<1)+(num<<3)+(c^48),c=gc();
    return num;
}

int n,a[300005];

inline
bool check(int l,int r){
    int maxn=0,minn=n+1;
    for(int re i=l;i<=r;++i){
        maxn=max(maxn,a[i]);
        minn=min(minn,a[i]);
    }
    if(maxn!=r||minn!=l)return false;
    int submaxn=0;
    maxn=0;
    for(int re i=l;i<=r;i+=2){
        if(maxn<a[i])maxn=a[i];
        else if(submaxn<a[i])submaxn=a[i];
        else return false;
    }
    return true;
}

int main(){
    n=getint();
    for(int re i=1;i<=n;++i){
        a[i]=getint();
    }
    for(int re i=1;i<=n;++i){
        if(a[i]==i)continue;
        int p;
        for(p=i;p<=n-2;p+=2){
            if(a[p+1]!=p+1||a[p+2]==p+2)break;
        }
        if(!check(i,p)){
            puts("No");
            return 0;
        }
        i=p;
    }
    puts("Yes");
    return 0;
}