Cod sursa(job #579845)
type muchie=^nod;
nod = record n:longint; a:muchie; end;
var v:array [1..100000] of muchie;
rmq:array [0..18, 1..300000] of longint;
poz:array [1..100000] of longint;
chk:array [0..100000] of boolean;
buf1, buf2:array [1.. 1 shl 17] of char;
i, j, m, n, x, y, t, k, p1, p2, p3, k1:longint;
p :muchie;
f, g:text;
function min (aa, bb:longint):longint;
begin
if aa<bb then min := aa else min :=bb;
end;
procedure dfs(a:muchie; c:longint);
begin
chk[c]:=true;
inc(t); rmq[0, t]:=c;
poz[c]:=t;
while a<> nil do
begin
if chk[a^.n] = false then
begin
dfs(v[a^.n], a^.n);
inc(t); rmq[0, t]:=c;
end;
a:=a^.a;
end;
end;
begin
assign (f, 'lca.in'); settextbuf (f, buf1); reset (f);
assign (g, 'lca.out'); settextbuf (g, buf2); rewrite (g);
read (f, n, m);
for i := 2 to n do
begin
read (f, x);
if v[x] = nil then begin new(v[x]); v[x]^.a:=nil; v[x]^.n:=i; end
else begin new(p); p^.n:=i; p^.a:=v[x]; v[x]:=p; end;
end;
dfs(v[1], 1);
k1:=0; x:=t;
while x <> 0 do begin inc (k1); x:= x shr 1; end;
k:=1;
for i := 1 to k1 do
begin
for j := 1 to t-k do
begin
rmq[i, j]:=min(rmq[i-1, j], rmq[i-1, j+k]);
end;
for j := t-k+1 to t do rmq[i, j]:=rmq[i-1, j];
k:=k shl 1;
end;
for i := 1 to m do
begin
readln (f, x, y);
p1:=poz[x]; p2:=poz[y];
if p1>p2 then begin p3:=p1; p1:=p2; p2:=p3; end;
p3:=p2-p1;
j:=0; while p3 > 1 do begin inc(j); p3:= p3 shr 1; end;
p3:=min(rmq[j, p1], rmq[j, p2- (1 shl j) +1]);
writeln (g, p3);
end;
close (f); close (g);
end.