#include <iostream>
#include<fstream>
#include<vector>
#define inf 1000000
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int sz,n,i,x,q,st[100000],tt[100001],lev[100001],a[100000],tree[10000],p_a[100000],y,qls,qld,poz[100000];
vector<int>v[100001];
void buildtree(int poz,int ls,int ld)
{
if(ls==ld)
{
tree[poz]=ls;
return;
}
int mij=(ls+ld)/2;
buildtree(2*poz,ls,mij);
buildtree(2*poz+1,mij+1,ld);
if(a[tree[2*poz]] < a[tree[2*poz+1]])
tree[poz]=tree[2*poz];
else tree[poz]=tree[2*poz+1];
//tree[poz]=min(tree[2*poz],tree[2*poz+1]);
}
int interogate(int poz,int ls,int ld)
{
if(qls<=ls && qld>=ld)
return tree[poz];
if(qls>ld || qld<ls)
return 0;
int mij=(ls+ld)/2;
if(a[interogate(2*poz,ls,mij)] < a[interogate(2*poz+1,mij+1,ld)])
return interogate(2*poz,ls,mij);
else
return interogate(2*poz+1,mij+1,ld);
//return min(interogate(2*poz,ls,mij),interogate(2*poz+1,mij+1,ld));
}
void parc_euler(int nod)
{
st[++sz]=nod;
for(int k=0;k<v[nod].size();k++)
{
parc_euler(v[nod][k]);
st[++sz]=nod;
}
}
void dfs(int nod,int niv)
{
lev[nod]=niv;
for(int k=0;k<v[nod].size();k++)
dfs(v[nod][k],niv+1);
}
int main()
{
f>>n>>q;
for(i=2;i<=n;i++)
{
f>>x;
tt[i]=x;
v[x].push_back(i);
}
parc_euler(1);
for(i=1;i<=sz;i++)
if(!p_a[st[i]])
p_a[st[i]]=i;
for(i=1;i<=sz;i++)
poz[st[i]]=i;
dfs(1,1);
for(i=1;i<=sz;i++)
a[i]=lev[st[i]];
buildtree(1,1,sz);
a[0]=inf;
for(i=1;i<=q;i++)
{
f>>qls>>qld;
qls=p_a[qls];
qld=p_a[qld];
if(qls>qld)
swap(qls,qld);
g<<st[interogate(1,1,sz)]<<'\n';
}
}