#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
FILE *f,*g;
int arb[200002];
struct graph
{
int node,next;
}v[200002];
int start[100002],st[200002],poz[100002],rang[100002];
int n,m,a,b,sol;
void read()
{ int y,k=0;
fscanf(f,"%d %d",&n,&m);
for(int i=2; i<=n; i++)
{
fscanf(f,"%d",&y);
v[++k].node=y;
v[k].next=start[i];
start[i]=k;
v[++k].node=i;
v[k].next=start[y];
start[y]=k;
}
}
int minim(int a,int b)
{
return a<b ? a:b;
}
void build(int node, int stg,int dr)
{
if(stg==dr)
{
arb[stg]=rang[st[stg]];
return;
}
int mij=(stg+dr)/2;
build(2*node, stg, mij);
build(2*node+1, mij+1, dr);
arb[node]=minim(arb[2*node],arb[2*node+1]);
}
void query(int node, int stg, int dr)
{
if(a<=stg && dr<=b)
{
if(arb[node]<sol)
sol=arb[node];
return;
}
int mij=(stg+dr)/2;
if(a<=mij)
query(2*node, stg, mij);
if(b>mij)
query(2*node+1,mij+1,dr);
}
void euler(int nod)
{
st[++st[0]]=nod;
if(!poz[nod])
poz[nod]=st[0];
for(int i=start[nod]; i; i=v[i].next)
{
if(!rang[v[i].node])
{
rang[v[i].node]=rang[nod]+1;
euler(v[i].node);
st[++st[0]]=nod;
}
}
}
void solve()
{ int x,y;
euler(1);
/*for(int i=1; i<=st[0]; i++)
fprintf(g,"%d ",st[i]);
fprintf(g,"\n");
for(int i=1; i<=st[0]; i++)
fprintf(g,"%d ",rang[st[i]]);*/
n=st[0];
build(1,1,n);
for(int l=1; l<=m; l++)
{
fscanf(f,"%d %d",&x,&y);
a=poz[y];
b=poz[x];
sol=9999999;
query(1,1,n);
fprintf(g,"%d\n",sol);
}
}
int main()
{
f=fopen("lca.in","r");
g=fopen("lca.out","w");
read();
solve();
//write();
fclose(f);
fclose(g);
return 0;
}