#include<cstdio>
#include<vector>
using namespace std;
vector<int>L[100100];
int n,m,i,j,v[200100],x[20][200100],a,b,t[200100],p[200100],y[200100],nr,d,q;
FILE *f,*g;
void dfs(int nod,int niv){
int i;
x[0][++nr]=nod;
y[nod]=niv;
if(v[nod]==0)
v[nod]=nr;
for(i=0;i<L[nod].size();i++){
dfs(L[nod][i],niv+1);
x[0][++nr]=nod;
}
}
int minim(int a,int b){
if(a<b)
return a;
return b;
}
void chg(int a,int b){
int aux;
aux=a;
a=b;
b=aux;
return;
}
int main(){
f=fopen("lca.in","r");
g=fopen("lca.out","w");
fscanf(f,"%d%d",&n,&m);
p[1]=0;
for(i=1;i<=200000;i++){
p[i]=p[i/2]+1;
}
for(i=2;i<=n;i++){
fscanf(f,"%d",&t[i]);
L[t[i]].push_back(i);
}
dfs(1,1);
for(i=1;i<=p[n];i++){
a=1<<(i-1);
for(j=1;j<=nr;j++){
if(a+j<=nr){
if(y[x[i-1][j]]<y[x[i-1][j+a]])
x[i][j]=x[i-1][j];
else
x[i][j]=x[i-1][j+a];
}
else
x[i][j]=x[i-1][j];
}
}
for(i=1;i<=m;i++){
fscanf(f,"%d%d",&a,&b);
a=v[a];
b=v[b];
if(a>b)
chg(a,b);
q=b-a+1;
d=1<<(p[q]);
if(y[x[p[q]][a]]<y[x[p[q]][b-d+1]])
fprintf(g,"%d\n",x[p[q]][a]);
else
fprintf(g,"%d\n",x[p[q]][b-d+1]);
/*if(y[x[p[q]-1][a]]>y[x[p[q]-1][b-d+1]])
fprintf(g,"%d\n",x[p[q]-1][b-d+1]);
else
fprintf(g,"%d\n",x[p[q]-1][a]);
*/
}
fclose(f);
fclose(g);
return 0;
}