#include<fstream>
using namespace std;
int pozmx,U[100001],C[100001],n,q,k,P[100001],hg,A[100001],i,Poz[100001],v[500001],val=0,a,b,mx=999999,x,y,poz,N[50001];
struct lista{int nod;
lista *leg;
} *G[100001],*p;
void adaug(int i,int j)
{
lista *p;
p=new lista;
p->nod=j;
p->leg=G[i];
G[i]=p;
}
void citire()
{
scanf("%d", &n);
scanf("%d", &q);
int i,k;
for(k=2;k<=n;++k)
{
scanf("%d", &i);
adaug(i,k);
}
}
void Euler(int start)
{
P[++k]=start;
Poz[start]=k;
A[k]=hg+1;
lista *p;
for(p=G[start];p;p=p->leg)
{
hg++;
Euler(p->nod);
hg--;
P[++k]=start;
A[k]=hg+1;
}
}
void cng(int nod,int st,int dr)
{
if(st==dr)
{
v[nod]=val;
N[nod]=st;
return;
}
int mij=(st+dr)/2;
if(poz<=mij) cng(nod*2,st,mij);
else cng(nod*2+1,mij+1,dr);
if(v[nod*2]<=v[nod*2+1])
{
v[nod]=v[nod*2];
N[nod]=N[nod*2];
}
else
{
v[nod]=v[nod*2+1];
N[nod]=N[nod*2+1];
}
}
void rmq(int nod,int st,int dr)
{
if(st>=a&&dr<=b)
{
if(v[nod]<=mx)
{ mx=v[nod];
pozmx=N[nod];
}
return;
}
int mij=(st+dr)/2;
if(a<=mij) rmq(nod*2,st,mij);
if(b>mij) rmq(nod*2+1,mij+1,dr);
}
void querry()
{
int i;
for(i=1;i<=k;++i)
{
val=A[i];
poz=i;
cng(1,1,k);
}
// for(i=1;i<=k;++i) printf("%d ", v[i]);
// printf("\n");
for(i=1;i<=q;++i)
{ scanf("%d", &x);
scanf("%d", &y);
mx=999999;
a=min(Poz[x],Poz[y]);
b=max(Poz[x],Poz[y]);
// printf("%d ", a);
// printf("%d \n", b);
pozmx=0;
rmq(1,1,k);
//printf("%d ",mx);
printf("%d \n", P[pozmx]);
// while(D[x]+1!=mx) x=T[x];
// printf("%d \n", x);
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
citire();
hg=0;
Euler(1);
/* for(i=1;i<=k;++i) printf("%d ", P[i]);
printf("\n");
for(i=1;i<=k;++i) printf("%d ", A[i]);
printf("\n");*/
querry();
return 0;
}