this is my approach
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxSize = 2e5+1;
vector<vector>dp(maxSize);
int main()
{
ll n,q;
cin>>n>>q;
ll i,a[n+1];
for(i=1;i<=n;i++)
{
cin>>a[i];
}
int j;
// int elm = (log(n+1)/log(2));
for(i=1;i<=n;i++)
{
dp[i].resize(n+1);
dp[i][0] = i;
dp[i][1] = a[i];
}
for(i=1;i<=(log(n)/log(2));i++)
{
for(j=1;j<=n;j++)
{
dp[j][(1<<i)] = dp[dp[j][(1<<i)/2]][(1<<i)/2];
}
}
while(q--)
{
ll node,dist;
cin>>node>>dist;
vector<ll>v;
while(dist)
{
ll temp = log(dist)/log(2);
if((1<<temp)<=dist)
{
v.push_back((1<<temp));
dist = dist-(1<<temp);
}
else
{
break;
}
}
ll start=node;
for(auto d:v)
{
start = dp[start][d];
}
// cout<<endl;
cout<<start<<endl;
}
}