Problem:
Score : 1500 points

Problem Statement

We have a grid with 3 rows and N columns.
The cell at the i-th row and j-th column is denoted (i, j).
Initially, each cell (i, j) contains the integer i+3j-3.

A grid with N=5 columns

Snuke can perform the following operation any number of times:

Choose a 3×3 subrectangle of the grid. The placement of integers within the subrectangle is now rotated by 180°.

An example sequence of operations (each chosen subrectangle is colored blue)

Snuke's objective is to manipulate the grid so that each cell (i, j) contains the integer a_{i,j}.
Determine whether it is achievable.

Constraints

5≤N≤10^5

1≤a_{i,j}≤3N

All a_{i,j} are distinct.

Input

The input is given from Standard Input in the following format:

N
a_{1,1} a_{1,2} ... a_{1,N}
a_{2,1} a_{2,2} ... a_{2,N}
a_{3,1} a_{3,2} ... a_{3,N}

Output

If Snuke's objective is achievable, print Yes. Otherwise, print No.

Sample Input 1

5
9 6 15 12 1
8 5 14 11 2
7 4 13 10 3

Sample Output 1

Yes

This case corresponds to the figure in the problem statement.

Sample Input 2

5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

Sample Output 2

No

Sample Input 3

5
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15

Sample Output 3

Yes

The objective is already achieved with the initial placement of the integers.

Sample Input 4

6
15 10 3 4 9 16
14 11 2 5 8 17
13 12 1 6 7 18

Sample Output 4

Yes

Sample Input 5

7
21 12 1 16 13 6 7
20 11 2 17 14 5 8
19 10 3 18 15 4 9

Sample Output 5

No

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 1e6 + 10;
constexpr int MOD = 1e9 + 7;

long long n, a[3][N], b[N], fen[2][3 * N];

void add (int x, int val, int p) {
    for (; x < 3 * N; x += x & (-x))
        fen[p][x] += val;
}

int get (int x, int p) {
    int ret = 0;
    for (; x; x -= x & (-x))
        ret += fen[p][x];
    return ret;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> n;
    for (int i = 0; i < 3; i++)
        for (int j = 1; j <= n; j++)
            cin >> a[i][j];
    for (int i = 1; i <= n; i++) {
        if ((a[1][i] % 3) == 2) {
            if ((abs (a[1][i] - a[0][i]) != 1) || (abs (a[1][i] - a[2][i]) != 1)) {
                cout << "No" << '\n';
                return 0;
            }
            b[i] = a[1][i];
            if (a[0][i] > a[1][i])
                b[i] = -b[i];
        }
        else {
            cout << "No" << '\n';
            return 0;
        }
    }
    long long invo = 0, inve = 0, cnto = 0, cnte = 0;
    for (int i = 1; i <= n; i++) {
        if (i & 1) {
            if (b[i] < 0)
                cnto++, b[i] = -b[i];
            add (b[i], 1, 1);
            invo += ((i + 1) / 2) - get (b[i], 1);
        }
        else {
            if (b[i] < 0)
                cnte++, b[i] = -b[i];
            add (b[i], 1, 0);
            inve += (i / 2) - get (b[i], 0);
        }
    }
    if ((cnto + inve) & 1)
        cout << "No" << '\n';
    else if ((cnte + invo) & 1)
        cout << "No" << '\n';
    else
        cout << "Yes" << '\n';
    return 0;
}