Cod sursa(job #139190)

Utilizator dascalu2Dascalu Andi FLorin dascalu2 Data 19 februarie 2008 20:03:44
Problema Stramosi Scor 60
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.45 kb
type adresai=^nodi;
     nodi= record
          poz,inf:longint;
          adr:adresai;
          end;
     adresa=^nod;
     nod= record
          inf:longint;
          adr:adresa;
          end;

var n,m,x,y,i:longint;
    t:array[1..250001]of byte;
    vi:array[1..250001]of adresai;
    vc:array[1..250001]of adresa;
    st:array[1..250001]of longint;
    rasp:array[1..350001]of longint;
    q:adresai;
    p:adresa;
procedure parcad(n,niv:integer);
var p:adresa;
begin
     st[niv]:=n;
     p:=vc[n];
     q:=vi[n];
     while(q<>nil)do
     begin
          if(niv-q^.inf<=0)then
          rasp[q^.poz]:=0
          else
          rasp[q^.poz]:=st[niv-q^.inf];
          q:=q^.adr;
     end;

     while(p<>nil)do
     begin
          parcad(p^.inf,niv+1);
          p:=p^.adr;
     end;

end;

begin
assign(input,'stramosi.in');
reset(input);
readln(n,m);
for i:=1 to n do
vc[i]:=nil;
for i:=1 to n do
begin
     read(x);
     if(x<>0)then
     begin
          t[i]:=1;
          new(p);
          p^.inf:=i;
          p^.adr:=vc[x];
          vc[x]:=p;
     end;
end;
for i:=1 to m do
vi[i]:=nil;
for i:=1 to m do
begin
     read(x,y);
     new(q);
     q^.inf:=y;
     q^.poz:=i;
     q^.adr:=vi[x];
     vi[x]:=q;
end;
close(input);
for i:=1 to n do
    if(t[i]=0)then
    parcad(i,1);
assign(output,'stramosi.out');
rewrite(output);
for i:=1 to m do
writeln(rasp[i]);
close(output);
end.