Cod sursa(job #1213785)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 28 iulie 2014 23:01:45
Problema Range minimum query Scor 90
Compilator fpc Status done
Runda Arhiva educationala Marime 1.01 kb
program rmq;
  var bufin,bufout:array [1..262144] of byte;
      n,m,i,j,k,pow,l,r,w:longint;
      a:array [0..16,1..100000] of longint;
      bin:array [1..100000] of longint;
      p:array[0..17]of longint;

function min(u,v:longint):longint;
  begin
    if u<v then min:=u else min:=v;
  end;

begin
  assign(input,'rmq.in');
  reset(input);
  settextbuf(input,bufin);
  assign(output,'rmq.out');
  rewrite(output);
  settextbuf(output,bufout);

  readln(n,m);
  for i:=1 to n do readln(a[0,i]);

  pow:=2; j:=1;
  while pow<=n do
    begin
      for i:=1 to n-pow+1 do

        a[j,i]:=min(a[j-1,i],a[j-1,i+pow shr 1]);
      pow:=pow shl 1;inc(j);
    end;

  pow:=1; k:=0;
  for i:=1 to 100000 do
    begin
      if i= pow then begin pow:=pow shl 1;inc(k); end;
      bin[i]:=k-1;
    end;
  p[0]:=1;
  for i:=1 to 17 do p[i]:=p[i-1] shl 1;
  for i:=1 to m do
    begin
      readln(l,r); w:=bin[r-l+1];
      writeln(min(a[w,l],a[w,r-p[w]+1]));
    end;
  close(output);
end.