#include<cstdio>
#include<vector>
using namespace std;
#define big 100005
int n,m,poz[big],it,t,k,x,y;
struct euler
{
int p,niv;
}a[2*big];
struct matrice
{
int min,poz;
}rmq[19][2*big];
vector<int>v[big];
void dfs(int x,int niv)
{
++it;
poz[x]=it;
a[it].p=x;
a[it].niv=niv;
rmq[0][it].min=x;
rmq[0][it].poz=it;
for(int i=0;i<v[x].size();i++)
{
dfs(v[x][i],niv+1);
++it;
a[it].p=x;
a[it].niv=niv;
rmq[0][it].min=x;
rmq[0][it].poz=it;
}
}
int log(int x)
{
int k,nr;
k=1;nr=0;
while(2*k<=x)
{
k*=2;
nr++;
}
return nr;
}
matrice minim(matrice a,matrice b)
{
matrice z;
if(a.min<b.min)
{
z=a;
}
else z=b;
return z;
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d",&t);
v[t].push_back(i+1);
}
dfs(1,1);
k=log(it);
for(int i=1;i<=k;i++)
for(int j=1;j+(1<<i)-1<=it;j++)
{
rmq[i][j]=minim(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
matrice sol;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
x=poz[x];
y=poz[y];
if(y<x)
swap(x,y);
k=log(y-x+1);
sol=minim(rmq[k][x],rmq[k][y-(1<<k)+1]);
printf("%d\n",a[sol.poz].p);
}
return 0;
}