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 <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <numeric>
#include <functional>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <memory>
#include <thread>
#include <tuple>

using namespace std;

int main() {
  char *no = "No";
  int n;
  scanf("%d", &n);
  vector<int> p(n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &p[i]);
    p[i]--;
    if (p[i] % 2 != i % 2) {
      puts(no);
      return 0;
    }
  }

  for (int i = 0; i + 1 < n; i++) {
    if (p[i] != i) {
      int j = i;

      int lastLeft = -1, lastRight = p[i];
      while (j + 2 < n && p[j + 2] != j + 2) {
        if (p[j + 1] != j + 1) {
          puts(no);
          return 0;
        }
        j += 2;
        if (p[j] < j) {
          if (lastLeft <= p[j]) {
            puts(no);
            return 0;
          }
          lastLeft = p[j];
        }
        else {
          if (lastRight <= p[j]) {
            puts(no);
            return 0;
          }
          lastRight = p[j];
        }
      }

      i = j;
    }
  }

  puts("Yes");
  return 0;
}