#include<bits/stdc++.h>
using namespace std;
int N,M,x,y,T[100001],level[100001],t[100001];
vector <int> G[100001];
void dfs(int nod,int par,int niv){
level[nod]=niv;
T[nod]=par;
for(int i=0;i<G[nod].size();++i)
dfs(G[nod][i],nod,niv+1);
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=2;i<=N;++i){
scanf("%d",&t[i]);
G[t[i]].push_back(i);
}
level[1]=1;
dfs(1,0,0);
while(M--){
scanf("%d%d",&x,&y);
while(T[x]!=T[y])
if(level[x]>level[y])x=T[x];
else y=T[y];
while(x!=y)
if(level[x]>level[y])x=t[x];
else y=t[y];
printf("%d\n",x);
}
return 0;
}