Cod sursa(job #309014)

Utilizator mlazariLazari Mihai mlazari Data 29 aprilie 2009 12:29:13
Problema Range minimum query Scor 100
Compilator fpc Status done
Runda tot Marime 1 kb
Program Rmq;
const maxn=100001;
      maxlog=17;
      u : longint=1;
var Intrare,Iesire : text;
    a : array[1..maxn] of longint;
    mk : array[0..maxlog,1..maxn] of longint;
    n,m,i,x,y : longint;
    j,k : byte;
    buf : array[1..65000] of byte;

begin
  assign(Intrare,'rmq.in');
  assign(Iesire,'rmq.out');
  reset(Intrare);
  rewrite(Iesire);
  settextbuf(Intrare,buf);
  readln(Intrare,n,m);
  for i:=1 to n do begin
    readln(Intrare,a[i]);
    mk[0,i]:=a[i];
  end;
  j:=1;
  while (u shl j)<=n do begin
    i:=1;
    while i+(u shl j)-1<=n do begin
      if mk[j-1,i]<mk[j-1,i+(u shl (j-1))] then mk[j,i]:=mk[j-1,i]
      else mk[j,i]:=mk[j-1,i+(u shl (j-1))];
      i:=i+1;
    end;
    j:=j+1;
  end;
  for i:=1 to m do begin
    readln(Intrare,x,y);
    k:=0;
    while (u shl (k+1))<=(y-x+1) do k:=k+1;
    if mk[k,x]<mk[k][y-(u shl k)+1] then writeln(Iesire,mk[k,x])
    else writeln(Iesire,mk[k][y-(u shl k)+1]);
  end;
  close(Intrare);
  close(Iesire);
end.