Cod sursa(job #184072)

Utilizator h_istvanHevele Istvan h_istvan Data 22 aprilie 2008 23:13:33
Problema Range minimum query Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 1.02 kb
program p_rmq;
const MAXL = 16;
      MAXN = 100000;
var f,fout:text;
    n,m,i,k,a,b,lg:longint;
    log,exp:array[0..MAXL] of longint;
    rmq:array[0..MAXL,1..MAXN] of longint;

function min(a,b:longint):longint;
begin
     if(a<b) then min:=a
             else min:=b;
end;

begin
     exp[0]:=1;
     for i:=1 to MAXL do
         exp[i]:=2*exp[i-1];
     log[1]:=0;
     for i:=2 to MAXL do
         log[i]:=log[i div 2]+1;

     assign(fout,'rmq.out');
     assign(f,'rmq.in');
     rewrite(fout);
     reset(f);
     readln(f,n,m);
     for i:=1 to n do
         readln(f,rmq[0,i]);

     for k:=1 to log[n] do
     begin
          i:=1;
          while(i+exp[k]-1 <= n) do
          begin
               rmq[k,i]:=min(rmq[k-1,i],rmq[k-1,i+exp[k-1]]);
               inc(i);
          end;
     end;
     for i:=1 to m do
     begin
          readln(f,a,b);
          lg:=log[b-a+1];
          writeln(fout,min(rmq[lg,a],rmq[lg,b-exp[lg]+1]));
     end;
     close(f);
     close(fout);
end.