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)

// ※※※ 解答不能 ※※※
// 解き直し.
// scott_wu氏.
// https://atcoder.jp/contests/arc102/submissions/3114772
// // 高速化, 計算量削減(計測結果(08.txt): 2660[ms], counter=1443280756).
// // デバッグログを出力しないと, 4011[ms] などと出力されるので, 不思議.
// // 解き直し.
// // ARC 102解説
// // https://img.atcoder.jp/arc102/editorial.pdf
// #include <bits/stdc++.h>
// using namespace std;
// const int MAX = 321123;
// int p[MAX];
// 
// int main(){
//     
//     // 1. 入力情報取得.
//     int N;
//     scanf("%d", &N);
//     bool ok = true;
//     priority_queue<int> pq;
//     for(int i = 1; i <= N; i++){
//         int v;
//         scanf("%d", &v);
//         p[i] = v;
//         
//         // 入力値 v と 場所 i の 偶奇 が 異なったら, 不成立.
//         if(v % 2 != i % 2) ok = false;
//         if(!ok){
//             printf("%s\n", "No");
//             return 0;
//         }
//         
//         // p[i - 1] > p[i] > p[i + 1] を 保存.
//         // ※ p[i - 1], p[i], p[i + 1] を ベース に考えた場合, 
//         // p[1]=25 p[2]=2 p[3]=0 のような, 情報が保存されてしまい, 計算量が増えてしまうので, 修正.
//         // -> p[i], p[i + 1], p[i + 2] を ベース に考えるようにする.
//         // if(i > 2 && i <= N && p[i - 2] > p[i - 1] && p[i - 1] > p[i]) pq.push(i - 2), printf("p[%d]=%d p[%d]=%d p[%d]=%d\n", i - 2, p[i - 2], i - 1, p[i - 1], i, p[i]);
//         if(i > 2 && i <= N && p[i - 2] > p[i - 1] && p[i - 1] > p[i]) pq.push(i - 2);
// 
//     }
//     
//     // 2. 解説通り.
//     int bef = 0; // 前回出現した要素を保存(※計算量削減のため).
//     int counter = 0;
//     while(!pq.empty()){
//         // 2-1. キューから取り出す.
//         int v = pq.top();
//         // printf("pq.size=%d v=%d\n", pq.size(), v);
//         pq.pop();
//         
//         // 2-2. 取り出した要素を処理.
//         int p1 = p[v], p2 = p[v + 1], p3 = p[v + 2];
//         // ※前回出現した要素と同じ場合は, Skip.
//         if(bef == p2) continue;
//         if(p1 > p2 && p2 > p3) swap(p[v], p[v + 2]);
//         
//         // 2-3. 新しい要素が発生したら追加.
//         // 左側チェック.
//         for(int i = v; i > 2; i -= 2){
//             int lp1 = p[i - 2], lp2 = p[i - 1], lp3 = p[i];
//             if(lp1 > lp2 && lp2 > lp3) swap(p[i], p[i - 2]);
//             counter++;
//         }
//         // 右側チェック.
//         for(int i = v + 2; i < N - 1; i += 2){
//             int rp1 = p[i], rp2 = p[i + 1], rp3 = p[i + 2];
//             if(rp1 > rp2 && rp2 > rp3) swap(p[i], p[i + 2]);
//             counter++;
//         }
//         
//         // 2-4. 前回出現した要素を更新.
//         bef = p2;
//     }
//     // printf("counter=%d\n", counter);
//     
//     // 3. 全ての i について, p[i] == i であるかの チェック.
//     for(int i = 1; i <= N; i++) if(p[i] != i) ok = false;
//     
//     // 4. 出力 ～ 後処理.
//     if(ok) printf("%s\n", "Yes");
//     else   printf("%s\n", "No");
//     
//     return 0;
// 
// }
#include <bits/stdc++.h>
using namespace std;
const int MAX = 321123;
int N;
int a[MAX], p[MAX], q[MAX];

int main(){
    
    // 1. 入力情報取得.
    scanf("%d", &N);
    for(int i = 0; i < N; i++) scanf("%d", a + i), a[i]--;
    
    // 2. データの並び替え情報を保存.
    // 左側.
    p[0] = a[0];
    for(int i = 1; i < N; i++) p[i] = max(p[i - 1], a[i]);
    // 右側.
    q[N - 1] = a[N - 1];
    for(int i = N - 2; i >= 0; i--) q[i] = min(q[i + 1], a[i]);
    
    // 3. p[i] = i と出来るかのチェック.
    bool ok = true;
    for(int i = 1; i < N - 1; i++) if(a[i] != i && p[i - 1] > a[i] && q[i + 1] < a[i]) ok = false;
    for(int i = 0; i < N - 1; i++) if((a[i] == i) == (a[i + 1] == i + 1) && p[i] != i) ok = false;
    
    // 4. 出力 ～ 後処理.
    if(ok) printf("%s\n", "Yes");
    else   printf("%s\n", "No");
    return 0;
    
}