Cod sursa(job #734115)

Utilizator ScriamTertiuc Afanasie Scriam Data 13 aprilie 2012 16:48:16
Problema Range minimum query Scor 30
Compilator fpc Status done
Runda Arhiva educationala Marime 1.26 kb
Program meteo;
var a : array[0..100000] of longint;
    n,l,k,v : longint;
    m : array[-1..10000,-1..20] of longint;


Function pt(f,p : longint) : longint;
var i : longint;
begin
pt:=1;
for i:=1 to p do
pt:=pt*f;
end;



procedure pre;
var i,j : longint;
begin
k:=trunc(ln(n)/ln(2))+1;
for i:=1 to n do
m[i][0]:=i;
{for j:=1 to n do
if a[m[j][0]]<a[m[j+1][0]] then m[j,1]:=m[j,0] else m[j,1]:=m[j+1,0]; }




 for j:=1 to k do
   for i:=1 to n do
   if a[m[i][j-1]]<=a[m[i+pt(2,j-1)][j-1]] then
   m[i][j]:=m[i][j-1] else
   m[i][j]:=m[i+pt(2,j-1)][j-1];

{ for i:=1 to n do
 begin
  for j:=0 to k do
  write(m[i][j],' ');
  writeln;
 end;    }



end;

Function afla(x,y : longint) : longint;
var i,j,u,r : longint;
begin
i:=x; j:=y;
u:=trunc(ln(j-i+1)/ln(2));
 if a[m[i][u]]<=a[m[j-pt(2,u)+1][u]] then
r:=m[i][u] else r:=m[j-pt(2,u)+1][u];
afla:=a[r];
end;






Procedure citire;
var i,x,y : longint;
    fin,fout : text;
begin
assign(fin,'rmq.in');    assign(fout,'rmq.out');
reset(fin);                rewrite(fout);
readln(fin,n,l);
for i:=1 to n do readln(fin,a[i]);
pre;
for i:=1 to l do
begin
readln(fin,x,y);
writeln(fout,afla(x,y));
end;

close(fin);  close(fout);
end;



begin
citire;

end.