#include <cstdio>
#include <iostream>
using namespace std;
int poz1,poz2,z,n,m,x,y,pozmin, a[200001],b[200001][40],niv[200001],fr[200001];
struct nod
{ int info;
nod *urm;
};
nod *gf[100001];
void Add(nod *&prim,int y)
{ nod *q=new nod;
q->info=y;
q->urm=prim;
prim=q;
}
void DFS(int xx,int nivv)
{ z++;a[z]=xx;niv[z]=nivv;
nod *p;
for(p=gf[xx];p!=NULL;p=p->urm)
{DFS(p->info,nivv+1);
z++;a[z]=xx;niv[z]=nivv;}
}
void Matrix()
{ int i,j;
for(i=1;i<=2*n-1;i++)
b[i][0]=i;
for(j=1;1<<j<=2*n-1;j++)
for(i=1;i+(1<<j)<=2*n-1;i++)
if(niv[b[i][j-1]]<niv[b[i+(1<<j)][j-1]]) b[i][j]=b[i][j-1];
else b[i][j]=b[i+(1<<(j-1))][j-1];
}
int Put(int yy,int xx)
{ int p=1,c=0;
while(p*2<=yy-xx+1)
{p*=2;
c++;}
return c;
}
int main()
{ int i,j;
FILE *f,*g,*h;
f=fopen("lca.in","r");
g=fopen("lca.out","w");
// h=fopen("txt.out","w");
fscanf(f,"%d %d",&n,&m);
for(i=2;i<=n;i++)
{fscanf(f,"%d",&x);
Add(gf[x],i);
}
DFS(1,1);
Matrix();
/* for(i=1;i<=2*n-1;i++)
fprintf(h,"%d ",a[i]);
fprintf(h,"\n");
for(i=1;i<=2*n-1;i++)
fprintf(h,"%d ",niv[i]);
fprintf(h,"\n");
for(i=1;i<=2*n-1;i++)
{for(j=0;(1<<j)<=2*n-1;j++)
fprintf(h,"%d ",b[i][j]);
fprintf(h,"\n");
}
*/
for(i=1;i<=2*n-1;i++)
if(fr[a[i]]==0) fr[a[i]]=i;
for(i=1;i<=m;i++)
{fscanf(f,"%d %d",&x,&y);
poz1=fr[x];
poz2=fr[y];
if(poz1>poz2) swap(poz1,poz2);
z=Put(poz2,poz1);
if(niv[b[poz1][z]]<=niv[b[poz2-(1<<z)+1][z]]) pozmin=b[poz1][z];
else pozmin=b[poz2-(1<<z)+1][z];
fprintf(g,"%d\n",a[pozmin]);
}
return 0;
}