#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=200100;
bool f[N],flag;
vector<int> head[N],h[N],nt[N],nt1[N];
int n,num[N],ring[N],cnt;
int check(int x)
{
    sort(nt[x].begin(),nt[x].end());
    unique(nt[x].begin(),nt[x].end());
    for(int i=0;i<nt[x].size();++i)
        if(nt[x][i]!=i)
            return i;
    return nt[x].size();
}
int check1(int x)
{
    sort(nt1[x].begin(),nt1[x].end());
    unique(nt1[x].begin(),nt1[x].end());
    for(int i=0;i<nt1[x].size();++i)
        if(nt1[x][i]!=i)
            return i;
    return nt1[x].size();
}
void dfs(int x)
{
    vector<int> a;
    if(f[x])
    {
        for(int i=0;i<head[x].size();++i)
        {
            int y=head[x][i];
            if(f[y]) continue;
            dfs(y);
            nt[x].push_back(num[y]);
        }
        sort(nt[x].begin(),nt[x].end());
        unique(nt[x].begin(),nt[x].end());
    }
    for(int i=0;i<head[x].size();++i)
    {
        int y=head[x][i];
        if(f[y]) continue;
        dfs(y);
        a.push_back(num[y]);
    }
    sort(a.begin(),a.end());
    unique(a.begin(),a.end());
    for(int i=0;i<a.size();++i)
        if(a[i]!=i)
        {
            num[x]=i;
            return;
        }
    num[x]=a.size();
}
int dfs1(int x)
{
    int t;
    if(f[x]) 
    {
        flag=true;
        return x;
    }
    f[x]=true;
    for(int i=0;i<h[x].size();++i)
    {
        t=dfs1(h[x][i]);
        if(t!=-1) 
        {
            if(flag) ring[++cnt]=x;
            if(x==t) flag=false;
            return t; 
        }
    }
    return -1;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        int t;
        cin>>t;
        head[t].push_back(i);
        h[i].push_back(t);
    }
    dfs1(1);
    memset(f,0,sizeof(f));
    for(int i=1;i<=cnt;++i)
        f[ring[i]]=true;
    for(int i=1;i<=cnt;++i)
        dfs(ring[i]);
    int a1=0,a2=0,i;
    bool f1,f2;
    for(i=0;i<nt[ring[1]].size();++i)
    {
        if(a1-1==nt[ring[1]][i]) continue;
        if(a1==nt[ring[1]][i])
        {
            ++a1;
            continue;
        }
        else
            break;
    }
    a2=a1+1;
    for(;i<nt[ring[1]].size();++i)
    {
        if(a2-1==nt[ring[1]][i]) continue;
        if(a2==nt[ring[1]][i])
        {
            ++a2;
            continue;
        }
        else
            break;
    }
    for(int i=1;i<=cnt;++i)
        nt1[ring[i]]=nt[ring[i]];
    
    nt[ring[cnt]].push_back(a1);
    for(int i=cnt;i>=2;i--)
        nt[ring[i-1]].push_back(check(ring[i]));
    sort(nt[ring[1]].begin(),nt[ring[1]].end());
    unique(nt[ring[1]].begin(),nt[ring[1]].end());
    f1=true;
    for(int i=0;i<nt[ring[1]].size()&&i<=a1;++i)
        if(i!=a1)  
        {   if(nt[ring[1]][i]!=i)
            {
                f1=false;
                break;
            }
        }
        else
            f1=f1&&nt[ring[1]][a1]!=a1;
    nt1[ring[cnt]].push_back(a2);
    for(int i=cnt;i>=2;i--)
        nt1[ring[i-1]].push_back(check1(ring[i]));
    sort(nt1[ring[1]].begin(),nt1[ring[1]].end());
    unique(nt1[ring[1]].begin(),nt1[ring[1]].end());
    f2=true;
    for(int i=0;i<nt1[ring[1]].size()&&i<=a2;++i)
        if(i!=a2)  
        {   if(nt1[ring[1]][i]!=i)
            {
                f2=false;
                break;
            }
        }
        else
            f2=f2&&nt1[ring[1]][a2]!=a2;
    if(f1||f2)
        cout<<"POSSIBLE"<<endl;
    else
        cout<<"IMPOSSIBLE"<<endl;
    return 0;
}

Measured memory_bytes: 50304