//LCA pe baza de RMQ complexitate (NlogN+M);
program LCA; uses math;
type
lista=^date;
date=record
m:longint;
next:lista;
end;
datee=record
x,nod:longint;
end;
tabel=array[0..17,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,step,p: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;
procedure preprocesarermq;
var aux,x:longint;
begin
x:=trunc(ln(nr)/ln(2));
for i:=1 to x do
for j:=1 to nr do
if j+(1 shl i)-1>nr then break else begin
rmq[i,j]:=rmq[i-1,j];
if rmq[i,j].x>rmq[i-1,j+1 shl (i-1)].x then rmq[i,j]:=rmq[i-1,j+1 shl (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);
if pos[x]>pos[y] then begin step:=pos[x]; pos[x]:=pos[y]; pos[y]:=step; end;
x:=pos[x]; y:=pos[y];
step:=v[y-x+1]; p:=1 shl step;
if rmq[step,x].x<rmq[step,y-p+1].x then writeln (f2,rmq[step,x].nod) else
writeln (f2,rmq[step,y-p+1].nod);
end;
close (f1);
close (f2);
end.