Cod sursa(job #579753)

Utilizator andreifirstCioara Andrei Ioan andreifirst Data 12 aprilie 2011 14:03:50
Problema Lowest Common Ancestor Scor 90
Compilator fpc Status done
Runda Arhiva educationala Marime 1.04 kb
var v:array [1..100000] of longint;
    niv:array [1..100000] of longint;
    buf1, buf2:array [1.. 1 shl 17] of char;
    i, j, m, n, x, y, p, l:longint;
    s:string;
    f, g:text;

procedure citire(var xx, yy:longint);
begin
xx:=0; yy:=0;
while (s[p]>='0') and (s[p]<='9') do
  begin
  xx:=xx*10+ord(s[p])-48;
  inc(p);
  end;
inc(p);

while (p<=l) do
  begin
  yy:=yy*10+ord(s[p])-48;
  inc(p);
  end;

readln(f, s);
p:=1;
l:=length(s);
end;

begin
assign (f, 'lca.in'); settextbuf (f, buf1); reset (f);
assign (g, 'lca.out'); settextbuf (g, buf2); rewrite (g);

read (f, n, m);

v[1]:=0; niv[1]:=1;
for i := 2 to n do
  begin
  read (f, v[i]); niv[i]:=niv[v[i]]+1;
  end;

readln (f, s); readln (f, s); l:=length(s); p:=1;
for i := 1 to m do
  begin
  citire(x, y);
  if niv[x]>niv[y] then begin while niv[x]<> niv[y] do x:=v[x]; end
                   else begin while niv[x]<> niv[y] do y:=v[y]; end;
  while x <> y do begin x:=v[x]; y:=v[y]; end;
  writeln (g, x);
  end;

close (f); close (g);
end.