Cod sursa(job #306999)

Utilizator mlazariLazari Mihai mlazari Data 22 aprilie 2009 18:14:51
Problema Range minimum query Scor 80
Compilator fpc Status done
Runda Arhiva educationala Marime 1.35 kb
Program Rmq;
var Intrare,Iesire : text;
    a,log2 : array[1..100000] of longint;
    mk : array[0..16,1..100000] of longint;
    d : array[0..16] of longint;
    n,m : longint;

procedure DeschideFisiere;
begin
  assign(Intrare,'rmq.in');
  reset(Intrare);
  assign(Iesire,'rmq.out');
  rewrite(Iesire);
end;

function min(x,y : longint) : longint;
begin
  if x<y then min:=x else min:=y;
end;

procedure preprocesare;
var i,k : longint;
begin
  d[0]:=1;
  for i:=1 to 16 do d[i]:=2*d[i-1];
  for i:=1 to n do log2[i]:=0;
  for i:=0 to 16 do log2[d[i]]:=i;
  k:=0;
  for i:=1 to n do
   if log2[i]=0 then log2[i]:=k else k:=log2[i];
  for i:=1 to n do mk[0,i]:=a[i];
  for k:=1 to log2[n] do begin
    for i:=1 to n do
     if n-i+1>d[k-1] then mk[k,i]:=min(mk[k-1,i],mk[k-1,i+d[k-1]])
     else mk[k,i]:=mk[k-1,i];
  end;
end;

function minim(x,y : longint) : longint;
var l : longint;
begin
  l:=log2[y-x+1];
  minim:=min(mk[l,x],mk[l,y-d[l]+1]);
end;

procedure proceseaza;
var i,x,y : longint;
begin
  readln(Intrare,n,m);
  for i:=1 to n do readln(Intrare,a[i]);
  preprocesare;
  for i:=1 to m do begin
    readln(Intrare,x,y);
    writeln(Iesire,minim(x,y));
  end;
end;

procedure InchideFisiere;
begin
  close(Intrare);
  close(Iesire);
end;

begin
  DeschideFisiere;
  proceseaza;
  InchideFisiere;
end.