Cod sursa(job #922107)

Utilizator Buzu_Tudor_RoCont vechi Buzu_Tudor_Ro Data 21 martie 2013 22:19:12
Problema Range minimum query Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 0.91 kb
Program p1;
var fi,fo:text; b:array[0..1 shl 20] of char;
    i,j,n,m,lim,x,y,aux,k:longint; r:array[0..100005,0..18] of longint;
    a:array[0..100005] of longint;

Function min(x,y:longint):longint;
begin
    if a[x]<a[y] then min:=x else min:=y;
end;

Procedure rmq;
begin
    lim:=trunc(ln(n)/ln(2));

    for j:=1 to lim do
       for i:=1 to n+1-(1 shl j) do
          r[i,j]:=min(r[i,j-1],r[i+(1 shl (j-1)),j-1]);
end;


begin
    assign(fi,'rmq.in'); reset(fi);
    assign(fo,'rmq.out'); rewrite(fo);
    settextbuf(fi,b); readln(fi,n,m);

    for i:=1 to n do begin readln(fi,a[i]); r[i,0]:=i; end;

    rmq;

    for i:=1 to m do begin
                     readln(fi,x,y);
                     aux:=trunc(ln(y+1-x)/ln(2));
                     k:=1 shl aux;
                     writeln(fo,a[min(r[x,aux],r[y+1-k,aux])]);
                     end;

    close(fi); close(fo);
end.