Cod sursa(job #168394)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 31 martie 2008 11:40:43
Problema Range minimum query Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.14 kb
program rmq;
const max = 100002;
var A : array [1..3*max] of longint;
    n,m,i,i1,i2,mn,x : longint;
    f,g : text;
function min(a,b:longint):longint;
begin
if a<b then min := a
       else min := b;
end;

procedure update(nod,i,j,p,v : longint);
var mij : longint;
begin

if i=j then A[nod] := v
        else begin
                mij := (i+j) div 2;
                if p<=mij then update(2*nod,i,mij,p,v)
                          else update(2*nod+1,mij+1,j,p,v);
                A[nod] := min(A[2*nod],A[2*nod+1]);
                end;
end;

procedure cauta(nod,st,dr,i1,i2:longint);
var mij : longint;
begin

if (i1<=st) and (dr<=i2) then mn := min(mn,A[nod])
else begin
        mij := (st+dr) div 2;
        if i1<=mij then cauta(2*nod,st,mij,i1,i2);
        if mij<i2 then cauta(2*nod+1,mij+1,dr,i1,i2);
        end;
end;


begin
assign(f,'rmq.in');
reset(f);
assign(g,'rmq.out');
rewrite(g);

readln(f,n,m);

for i := 1 to n do begin
readln(f,x);
update(1,1,n,i,x);
end;

for i := 1 to m do begin
readln(f,i1,i2);
mn := 100000;
cauta(1,1,n,i1,i2);
writeln(g,mn);
end;

close(f);
close(g);

end.