Cod sursa(job #1418334)

Utilizator laura.calimanLaura Caliman laura.caliman Data 12 aprilie 2015 19:32:40
Problema Range minimum query Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.13 kb
var n,m,i,j,k,x,y:longint;
    a,b:array[1..100000] of longint;
    
procedure bmin;
var i,j,r:longint;
begin
  j:=0;
  i:=0;
  while i<n do begin
    inc(j);
    inc(i);
    r:=i;
    b[j]:=i;
    for i:=r to r+k-1 do begin
      if a[j]>a[i] then b[j]:=i;
      if i=n then break;
    end;
  end;
//  for i:=1 to j do write(a[b[i]],' ');
//  writeln;
end;

procedure rmq(x,y:longint);
var i,j,m,x1,y1,m1,m2:longint;
begin
  x1:=((x-1) div k) + 1;
  if (x mod k <> 1) then 
    inc(x1);
    
  y1:=(y-1) div k;
  if (y mod k = 0) then
    inc(y1);
  
  // calculam minimul din intervalele intregi de lungime k
  m:=a[b[x1]];
//  writeln(x1,' ',y1);
  for i:=x1+1 to y1 do begin
    if m>a[b[i]] then m:=a[b[i]];
  end;
  
  for i:=x to (x1-1)*k do 
    if m>a[i] then m:=a[i];
  
  for i:=y downto y1*k+1 do
    if m>a[i] then m:=a[i];

  writeln(m);
end;
    
begin
  assign(input,'rmq.in');
  assign(output,'rmq.out');
  reset(input);
  rewrite(output);
  read(n,m);
  k:=trunc(sqrt(n));
  for i:=1 to n do read(a[i]);
  bmin;
  for i:=1 to m do begin
    read(x,y);
    rmq(x,y);
  end;
end.