#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
vector<vector<int>>graph;
vector<vector<pair<int,int>>> query;
vector<bool> visited;
vector<int> path,sol;
void dfs(int node)
{
if(!visited[node]) visited[node]=true;
path.push_back(node);
for(auto vec:query[node])
{
int idx=path.size()-1-vec.first;
if(idx>=0) sol[vec.second]=path[idx];
}
for(int neighbor:graph[node])
if(!visited[neighbor]) dfs(neighbor);
path.pop_back();
}
int main()
{
int n,m; cin>>n>>m;
graph.resize(n+1,vector<int>());
visited.resize(n+1,false);
sol.resize(m+1,0); query.resize(n+1);
for(int i=1;i<=n;i++){
int x; cin>>x;
if(x==0) continue;
graph[i].push_back(x);
graph[x].push_back(i);
}
for(int i=1;i<=m;i++){
int q,p; cin>>q>>p;
query[q].push_back({p,i});
}
for(int i=1;i<=n;i++){
if(!visited[i]) dfs(i);
}
for(int i=1;i<=m;i++) cout<<sol[i]<<'\n';
return 0;
}