Cod sursa(job #1213437)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 28 iulie 2014 10:02:50
Problema Range minimum query Scor 80
Compilator fpc Status done
Runda Arhiva educationala Marime 1.18 kb
program rmq;
  var bufin,bufout:array [1..100000] of byte;
      n,m,i,j,k,pow,l,r:longint;
      a:array [0..16,1..100000] of longint;
      bin: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
        if a[j-1,i]<a[j-1,i+pow shr 1] then a[j,i]:=a[j-1,i]
                                       else a[j,i]:=a[j-1,i+pow shr 1];
      {  a[j,i]:=min(a[j-1,i],a[j-1,i+pow shr 1]);}
      pow:=pow shl 1;inc(j);
    end;

  bin[0]:=1;
  for i:=1 to 17 do bin[i]:=bin[i-1] shl 1;

  for i:=1 to m do
    begin
      readln(l,r);
      k:=0;
      while bin[k]<=r-l+1 do
        begin
          inc(k);
        end;
      dec(k);
      if a[k,l]<a[k,r-bin[k]+1] then writeln(a[k,l])
                                else writeln(a[k,r-bin[k]+1]);
      {writeln(min(a[k,l],a[k,r-bin[k]+1])); }
    end;
  close(output);
end.