Cod sursa(job #69092)

Utilizator mlazariLazari Mihai mlazari Data 1 iulie 2007 11:13:09
Problema Stramosi Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.35 kb
Program Stramosi; uses timp;
const opt : array[0..6] of longint=(1,8,64,512,4096,32768,262144);
var m,n : longint;
    S : array[0..250000,0..5] of longint;
    log8 : array[1..250000] of integer;
    Intrare,Iesire : text;  t1 : real;

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 CalcLog8;
var i : longint;
    p : integer;
begin
  p:=0;
  while opt[p+1]-1<=n do
   begin
     for i:=opt[p] to opt[p+1]-1 do log8[i]:=p;
     p:=p+1;
   end;
  for i:=opt[p] to n do log8[i]:=p;
end;

procedure Calcule;
var i,j,ip : longint;
begin
  CalcLog8;
  for i:=0 to 5 do S[0,i]:=0;
  for i:=1 to log8[n] do
   begin
     ip:=i-1;
     for j:=1 to n do
      S[j,i]:=S[S[S[S[S[S[S[S[j,ip],ip],ip],ip],ip],ip],ip],ip];
   end;
end;

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

begin
  Citeste; t1:=timpulcurent;
  Calcule;
  Procesare; writeln(timpulcurent-t1:0:3); readln;
end.