#include<stdio.h>
#include<vector>
#define ND 100001
#define LE 200100
using namespace std;
vector<int> v[ND];
int n,i,t,m,nr,poz[ND],niv[ND],gr[ND],dad[ND],
E[LE],rmq[20][LE],lin[LE];
void read(),solve(),PE(int nod),RMQ();
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=2;i<=n;i++)
{
scanf("%d",&t);dad[i]=t;
v[t].push_back(i);gr[t]++;
}
}
void solve()
{
int U,V,a,b,L,LL,P;
PE(1);
for(i=2;i<=nr;i<<=1)lin[i]=1;
for(i=1;i<=nr;i++)lin[i]+=lin[i-1];
RMQ();
for(;m;m--)
{
scanf("%d%d",&a,&b);
a=poz[a];b=poz[b];
if(a>b)a^=b^=a^=b;
L=lin[b-a+1];
P=1<<L;
U=rmq[L][a];V=rmq[L][b-P+1];
U=niv[U]<niv[V]?U:V;
printf("%d\n",U);
}
}
void PE(int nod)
{
vector<int>::iterator it;
niv[nod]=niv[dad[nod]]+1;
E[++nr]=nod;poz[nod]=nr;
if(!gr[nod])return;
for(it=v[nod].begin();it!=v[nod].end();it++)
{
PE(*it);E[++nr]=nod;
}
}
void RMQ()
{
int S,D,L,LL,K=0,k=-1;
for(i=1;i<=nr;i++)
rmq[0][i]=E[i];
for(L=1,LL=2;LL<=nr;L<<=1,LL<<=1)
{
k++;K++;
for(S=1,D=LL;D<=nr;S++,D++)
{
rmq[K][S]=rmq[k][S];
if(niv[rmq[k][S+L]]<niv[rmq[K][S]])
rmq[K][S]=rmq[k][S+L];
}
}
}