Cod sursa(job #587352)

Utilizator elffikkVasile Ermicioi elffikk Data 4 mai 2011 18:25:56
Problema Range minimum query Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 1.19 kb
var a:array[1..1 shl 17,0..17]of longint;
    d,n,nn,m:longint;


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

procedure rez;
var i,j,p:longint;
begin
  p:=1;
  for j:=1 to d do
  begin
    for i:=1 to n do
      a[i,j]:=min(a[i,j-1],a[min(n,i+p),j-1]);
    p:=p*2;
  end;
end;

function log2(k:longint):longint;
var d:longint;
begin
  d:=0;
  while 1 shl d<=k do inc(d);
  log2:=d-1;
end;

function rmq(x,y:longint):longint;
var d:longint;
begin
   if x=y then rmq:=a[x,1]
   else begin
     d:=log2(y-x);
     rmq:=min(a[x,d],a[y-(1 shl d)+1,d]);
   end
end;


procedure init;
var f,ff:text; i,j,x,y:longint;
begin
  assign(f,'rmq.in');
  reset(f);
  assign(ff,'rmq.out');
  rewrite(ff);
  read(f,n,m);
  for i:=1 to n do begin read(f,a[i,0]); {write(a[i,1],' ');}end;
  d:=1 shl log2(n);
  if 1 shl d<n then inc(d);
  nn:=1 shl d;
  for i:=n+1 to nn do a[i,0]:=a[n,0];
  n:=nn;
  rez;
  for i:=1 to m do
  begin
    read(f,x,y);
    writeln(ff,rmq(x,y));
  end;
  close(f);
  close(ff);
end;

begin
  init;
  {writeln;
  writeln(ad(1),' ',ad(2),' ',ad(3),' ',ad(10),' ',ad(31),' ',ad(32));
  readln;}
end.