//RMQ complexitate (NlogN+M);
program LCA;
type
lista=^date;
date=record
m:longint;
next:lista;
end;
datee=record
x,nod:longint;
end;
tabel=array[0..20,0..200001] of datee;
tabe=array[0..100001] of lista;
tabb=array[0..200001] of longint;
buf=array[0..1 shl 19] of char;
var
rmq:tabel;
ff1,ff2:buf; a:lista;
t:tabe; pos,v:tabb;
n,m,i,j,nr,x,y:longint;
f1,f2:text;
procedure euler(lv,nod:longint);
var a:lista;
begin
nr:=nr+1; rmq[0,nr].x:=lv; rmq[0,nr].nod:=nod;
if pos[nod]=0 then pos[nod]:=nr; a:=t[nod];
while a<>nil do begin
euler(lv+1,a^.m);
nr:=nr+1; rmq[0,nr].x:=lv; rmq[0,nr].nod:=nod;
a:=a^.next;
end; end;
function min(a,b:datee):datee;
begin
if a.x<b.x then min:=a else min:=b; end;
procedure preprocesarermq;
var aux:longint;
begin
i:=1;
while 1 shl i<=nr do begin
j:=1; aux:=1 shl (i-1);
while j+1 shl i-1<=nr do begin
rmq[i,j]:=min(rmq[i-1,j],rmq[i-1,j+aux]);
j:=j+1;
end;
i:=i+1;
end;
for i:=2 to nr do v[i]:=v[i div 2]+1;
end;
function query(x,y:longint):longint;
var step,p,i:longint;
begin
if x>y then begin step:=x; x:=y; y:=step; end;
step:=v[y-x+1]; p:=1 shl step;
if rmq[step,x].x<=rmq[step,y-p+1].x then query:=rmq[step,x].nod else
query:=rmq[step,y-p+1].nod;
end;
begin
assign (f1,'lca.in');
assign (f2,'lca.out');
reset (f1);
rewrite (f2);
settextbuf(f1,ff1);
settextbuf(f2,ff2);
readln (f1,n,m);
for i:=1 to n-1 do begin
read (f1,x);
new(a); a^.m:=i+1; a^.next:=t[x]; t[x]:=a;
end;
nr:=0; euler(0,1);
preprocesarermq;
for i:=1 to m do begin
readln (f1,x,y);
writeln (f2,query(pos[x],pos[y]));
end;
close (f1);
close (f2);
end.