Cod sursa(job #586955)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 3 mai 2011 16:16:11
Problema Range minimum query Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 1.14 kb
var     a,b:array[1..100000]of longint;
        n,m,i,j,min,x,y,r,k,t:longint;
        f,g:text;

function max(a,b:longint):longint;
begin
  max:=a;
  if b>min then max:=b;
end;

function minim(a,b:longint):longint;
begin
  minim:=a;
  if b<minim then min:=b;
end;

begin
  assign(f,'rmq.in');
  assign(g,'rmq.out');
  reset(f);
  rewrite(g);
  readln(f,n,m);
  for i:=1 to n do
    readln(f,a[i]);
  r:=trunc(sqrt(n));

  for i:=n+1 to (r+1)*(r+1) do
    a[i]:=a[n];

  n:=(r+1)*(r+1);
  inc(r);

  for i:=1 to r do
    begin
      b[i]:=a[(i-1)*r+1];
  for j:=(i-1)*r+1 to i*r do
    if a[j]<b[i] then b[i]:=a[j];
    end;

  for i:=1 to r do
    writeln(b[i]);
    readln;
  for i:=1 to m do
    begin
      readln(f,x,y);
      min:=a[x];

      j:=(x div r)+1;
      while (j-1)*r<x do inc(j);
      k:=j-1;
      while j*r<y do
        begin
          if b[j]<min then min:=b[j];
          inc(j);
        end;
      for t:=x to minim(y,k*r) do
        if a[t]<min then min:=a[t];
      for t:=max(x,(j-1)*r) to y do
        if a[t]<min then min:=a[t];
      writeln(g,min);
    end;
  close(g);
end.