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 (GCC 9.2.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>

#define N	300000

int min(int a, int b) { return a < b ? a : b; }

int main() {
	static int ii[N];
	static char safe[N];
	int n, i, a, b, c;

	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%d", &a), a--;
		ii[a] = i;
	}
	for (b = n - 1; b >= 0; b--) {
		i = ii[b], a = b;
		while (i < a)
			i = min(i, ii[--a]);
		for (c = b - 1; c >= a; c -= 2)
			if (ii[c] != c) {
				printf("No\n");
				return 0;
			}
		i = -1;
		for (c = a + (a + b) % 2; c <= b; c += 2)
			if (i < ii[c])
				i = ii[c], safe[c] = 1;
		i = n;
		for (c = b; c >= a; c -= 2) {
			if (!safe[c] && i < ii[c]) {
				printf("No\n");
				return 0;
			}
			i = min(i, ii[c]);
		}
	}
	printf("Yes\n");
	return 0;
}