Cod sursa(job #69219)

Utilizator mlazariLazari Mihai mlazari Data 1 iulie 2007 21:44:58
Problema Stramosi Scor 80
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.48 kb
Program Stramosi;
const cub : array[0..11] of longint=(1,3,9,27,81,243,729,2187,6561,19683,
                                     59049,177147);
var m,n : longint;
    S : array[0..250000,0..11] of longint;
    log3 : array[1..250000] of integer;
    Intrare,Iesire : text;

procedure Citeste;
var i : longint;
begin
  assign(Intrare,'stramosi.in');
  reset(Intrare);
  readln(Intrare,n,m);
  for i:=1 to n do read(Intrare,S[i,0]);
end;

procedure CalcLog3;
var i : longint;
begin
  for i:=1 to 2 do log3[i]:=0;
  for i:=3 to 8 do log3[i]:=1;
  for i:=9 to 26 do log3[i]:=2;
  for i:=27 to 80 do log3[i]:=3;
  for i:=81 to 242 do log3[i]:=4;
  for i:=243 to 728 do log3[i]:=5;
  for i:=729 to 2186 do log3[i]:=6;
  for i:=2187 to 6560 do log3[i]:=7;
  for i:=6561 to 19682 do log3[i]:=8;
  for i:=19683 to 59048 do log3[i]:=9;
  for i:=59049 to 177146 do log3[i]:=10;
  for i:=177147 to 250000 do log3[i]:=11;
end;

procedure Calcule;
var i,j,ip : longint;
begin
  CalcLog3;
  for i:=0 to 11 do S[0,i]:=0;
  for i:=1 to log3[n] do
   for j:=1 to n do S[j,i]:=S[S[S[j,i-1],i-1],i-1];
end;

procedure Procesare;
var i,Q,P : longint;
begin
  assign(Iesire,'stramosi.out');
  rewrite(Iesire);
  for i:=1 to m do
   begin
     readln(Intrare,Q,P);
     while P>0 do
      begin
        Q:=S[Q,log3[P]];
        P:=P-cub[log3[P]];
      end;
     writeln(Iesire,Q);
   end;
  close(Intrare);
  close(Iesire);
end;

begin
  Citeste;
  Calcule;
  Procesare;
end.