Cod sursa(job #1516873)

Utilizator ili226Vlad Ilie ili226 Data 3 noiembrie 2015 17:57:30
Problema Range minimum query Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.74 kb
type nd=^nod;
     nod=record
          val:longint;
          st,dr:nd
         end;
var f,fo:text;
    n,m,x,y,i:longint;
    rmq:nd;
procedure init(st,dr:longint;var x:nd);
var p:nd;
    m:longint;
begin
 m:=st+(dr-st)div 2;
 new(p);
 p^.val:=100003;
 p^.st:=nil;
 p^.dr:=nil;
 if st<dr then
  begin
   init(st,m,p^.st);
   init(m+1,dr,p^.dr)
  end;
 x:=p;
end;
function adauga(st,dr,x,poz:longint;var rmq:nd):longint;
var m,a,b:longint;
begin
 if st=dr then
  begin
   rmq^.val:=x;
   adauga:=x
  end
          else
  begin
   m:=st+(dr-st)div 2;
   a:=rmq^.st^.val;
   b:=rmq^.dr^.val;
   if poz<=m then
    a:=adauga(st,m,x,poz,rmq^.st);
   if poz>m then
    b:=adauga(m+1,dr,x,poz,rmq^.dr);
   if a<b then
    begin
     rmq^.val:=a;
     adauga:=a
    end
          else
    begin
     rmq^.val:=b;
     adauga:=b
    end
  end;
end;
function min(st,dr,x,y:longint;rmq:nd):longint;
var minim,m,a,b:longint;
begin
 if (st>=x)and(dr<=y)
  then min:=rmq^.val
  else
  if (st<=y)and(dr>=x)then
   begin
    m:=st+(dr-st)div 2;
    a:=100003;b:=100003;
    if (x<=m)and(m<=y)then
     begin
      a:=min(st,m,x,y,rmq^.st);
      b:=min(m+1,dr,x,y,rmq^.dr)
     end
                      else
     if m>=y then
      a:=min(st,m,x,y,rmq^.st)
             else
      b:=min(m+1,dr,x,y,rmq^.dr);
     minim:=a;
     if b<minim then minim:=b;
     min:=minim
   end
                     else
   min:=100003
end;
begin
assign(f,'rmq.in');
assign(fo,'rmq.out');
reset(f);
readln(f,n,m);
init(1,n,rmq);
for i:=1 to n do
 begin
  readln(f,x);
  adauga(1,n,x,i,rmq);
 end;
rewrite(fo);
for i:=1 to m do
 begin
  readln(f,x,y);
  writeln(fo,min(1,n,x,y,rmq));
 end;
close(fo);
close(f);

end.