CSES - Shared codeLink to this code:
https://cses.fi/paste/660de7a19da3017e6808df/
#include<iostream>
#include<array>
using namespace std;
int table[200001][20];
bool vis[200001];
int dis[200001];
void dfs(int u){
if(vis[u])return ;
vis[u]=true;
dfs(table[u][0]);
dis[u]=dis[table[u][0]]+1;
}
int main(){
int n,q,a,b,i,j,end;
cin>>n>>q;
for(i=1;i<=n;i++){
cin>>table[i][0];
}
for(j=1;j<20;j++){
for(i=1;i<=n;i++){
table[i][j]=table[table[i][j-1]][j-1];
}
}
auto lift=[&](int node,int len){
if(len<=0)return node;
i=0;
while(len){
if(len&1)
node=table[node][i];
len>>=1;
i++;
}
return node;
};
for(i=1;i<=n;i++){
if(!vis[i])dfs(i);
}
while(q--){
cin>>a>>b;
end=lift(a,dis[a]);
if(lift(a,dis[a]-dis[b])==b){
cout<<dis[a]-dis[b]<<endl;
}else if(lift(end,dis[end]-dis[b])==b){
cout<<dis[a]+dis[end]-dis[b]<<endl;
}else{
cout<<-1<<endl;
}
}
return 0;
}