Problem:
Score : 800 points

Problem Statement

There is a directed graph with N vertices and N edges. The vertices are numbered 1, 2, ..., N.

The graph has the following N edges: (p_1, 1), (p_2, 2), ..., (p_N, N), and the graph is weakly connected. Here, an edge from Vertex u to Vertex v is denoted by (u, v), and a weakly connected graph is a graph which would be connected if each edge was bidirectional.

We would like to assign a value to each of the vertices in this graph so that the following conditions are satisfied. Here, a_i is the value assigned to Vertex i.

Each a_i is a non-negative integer.

For each edge (i, j), a_i \neq a_j holds.

For each i and each integer x(0 ≤ x < a_i), there exists a vertex j such that the edge (i, j) exists and x = a_j holds.

Determine whether there exists such an assignment.

Constraints

2 ≤ N ≤ 200 000

1 ≤ p_i ≤ N

p_i \neq i

The graph is weakly connected.

Input

Input is given from Standard Input in the following format:

N
p_1 p_2 ... p_N

Output

If the assignment is possible, print POSSIBLE; otherwise, print IMPOSSIBLE.

Sample Input 1

4
2 3 4 1

Sample Output 1

POSSIBLE

The assignment is possible: {a_i} = {0, 1, 0, 1} or {a_i} = {1, 0, 1, 0}.

Sample Input 2

3
2 3 1

Sample Output 2

IMPOSSIBLE

Sample Input 3

4
2 3 1 1

Sample Output 3

POSSIBLE

The assignment is possible: {a_i} = {2, 0, 1, 0}.

Sample Input 4

6
4 5 6 5 6 4

Sample Output 4

IMPOSSIBLE

Solution in C (GCC 9.2.1) (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>

#define N	200000

int *oj[N], oo[N];

void link(int i, int j) {
	int o = oo[i]++;

	if (o >= 2 && (o & o - 1) == 0)
		oj[i] = (int *) realloc(oj[i], o * 2 * sizeof *oj[i]);
	oj[i][o] = j;
}

int aa[N];

void dfs(int i) {
	static char used[N];
	int o;

	for (o = 0; o < oo[i]; o++) {
		int j = oj[i][o];

		dfs(j);
	}
	for (o = 0; o < oo[i]; o++) {
		int j = oj[i][o];

		used[aa[j]] = 1;
	}
	while (used[aa[i]])
		aa[i]++;
	for (o = 0; o < oo[i]; o++) {
		int j = oj[i][o];

		used[aa[j]] = 0;
	}
}

int main() {
	static int pp[N];
	static char visited[N];
	int n, i, k, a;

	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &pp[i]), pp[i]--;
	i = 0;
	while (!visited[i])
		visited[i] = 1, i = pp[i];
	k = 0;
	while (visited[i] == 1)
		visited[i] = 2, i = pp[i], k++;
	if (k % 2 == 0) {
		printf("POSSIBLE\n");
		return 0;
	}
	for (i = 0; i < n; i++)
		oj[i] = (int *) malloc(2 * sizeof *oj[i]);
	for (i = 0; i < n; i++)
		if (visited[i] != 2)
			link(pp[i], i);
	a = -1;
	for (i = 0; i < n; i++)
		if (visited[i] == 2) {
			dfs(i);
			if (a != -1 && a != aa[i]) {
				printf("POSSIBLE\n");
				return 0;
			}
			a = aa[i];
		}
	printf("IMPOSSIBLE\n");
	return 0;
}