Cod sursa(job #307002)

Utilizator mlazariLazari Mihai mlazari Data 22 aprilie 2009 18:30:18
Problema Range minimum query Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 1.07 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,i,k,l,x,y,n1,n2 : longint;

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-d[k-1] do begin
      n1:=mk[k-1,i];
      n2:=mk[k-1,i+d[k-1]];
      if n1<n2 then mk[k,i]:=n1 else mk[k,i]:=n2;
    end;
  end;
end;

begin
  assign(Intrare,'rmq.in');
  reset(Intrare);
  assign(Iesire,'rmq.out');
  rewrite(Iesire);
  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);
    l:=log2[y-x+1];
    n1:=mk[l,x];
    n2:=mk[l,y-d[l]+1];
    if n1<n2 then writeln(Iesire,n1) else writeln(Iesire,n2);
  end;
  close(Intrare);
  close(Iesire);
end.