Cod sursa(job #1410362)

Utilizator casianos1996Marc Casian Nicolae casianos1996 Data 31 martie 2015 00:16:14
Problema Range minimum query Scor 20
Compilator fpc Status done
Runda Arhiva educationala Marime 1.52 kb
program RMQ;
var     f,g:text;
        bufin,bufout:array[1..1 shl 16] of byte;
        n,m,i,j,k:longint;
        d:array[0..17,1..100000] of longint;
        v:array[1..100000] of longint;

procedure readdata;
var       i:longint;
begin
  assign(f,'rmq.in'); reset(f);
  assign(g,'rmq.out'); rewrite(g);
  settextbuf(f,bufin); settextbuf(g,bufout);
  readln(f,n,m);
  for i:=1 to n do
    readln(f,v[i]);
end;

function min(st,dr:longint):longint;
var      i:longint;
begin
  min:=maxlongint;
  for i:=st to dr do
    if min>v[i] then min:=v[i];
end;

procedure rezolva;
var       pow,i,j,k:longint;
begin
  pow:=1;
  for i:=1 to n do
    d[0,i]:=v[i];
  for i:=1 to trunc(ln(n)/ln(2)) do
    begin
      pow:=pow*2;
      for j:=1 to n do
        begin
          if j+pow-1>n then break;
          d[i,j]:=min(j,j+pow-1);
        end;
    end;
end;

function gasestek(x,y:longint; var pow:longint):longint;
var      i:longint;
begin
  pow:=1;
  gasestek:=0;
  while 2*pow<y-x do
    begin
      pow:=pow*2;
      gasestek:=gasestek+1;
    end;
end;

procedure afis;
var       pow,k,i,x,y:longint;
begin
  for i:=1 to m do
    begin
      readln(f,x,y);
      k:=gasestek(x,y,pow);
      if d[k,x]<d[k,y-pow+1] then writeln(g,d[k,x])
      else writeln(g,d[k,y-pow+1]);
    end;
end;

begin
  readdata;
  rezolva;
 { for i:=0 to trunc(ln(n)/ln(2)) do
    begin
      for j:=1 to n do
        write(d[i,j],' ');
      writeln;
    end; }
  afis;
  close(g);
  close(f);
end.