Cod sursa(job #579845)

Utilizator andreifirstCioara Andrei Ioan andreifirst Data 12 aprilie 2011 15:22:30
Problema Lowest Common Ancestor Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.64 kb
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.