Link 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;
}