Cod sursa(job #195899)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 23 iunie 2008 11:10:50
Problema Arbori de intervale Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 2.22 kb
program arbint;
const Nmax=100100;
var
    v:array[0..Nmax]of longint;
    stdin,stdout:text;
    a,b,x,i,n,m:longint;
    start, finish, val, pos, maxim:longint;
    arb:array[0..400100]of longint;

procedure querry(nod,left,right:longint);
var mid:longint;
begin
     if (start<=left) and (right<=finish)then
        begin
             if ( maxim < arb[nod] )then
                maxim := arb[nod];
        end
     else
         begin
             mid:=(left+right)div 2;
             if (start<=mid)then
                querry(2*nod,start,mid);
             if (mid<finish)then
                    querry(2*nod+1,mid+1,finish);
         end;
end;

function max(a,b:integer):integer;
begin
     maxim:=0;
    if (a>b)then
        maxim:=a
    else
        maxim:=b;
end;

procedure update(nod,left,right:longint);
var mid:longint;
begin
    mid:=(left+right)div 2;
    if (left=right)then
        begin
            arb[nod]:=val;
            //return;
        end
    else
        begin
             if (pos<=mid)then
                update(2*nod,left,mid)
             else
                 begin
                      update(2*nod+1,mid+1,right);
                 end;
             arb[nod] := max( arb[2*nod], arb[2*nod+1] );
        end;
end;

procedure make;
var i:longint;
begin
    for i:=1 to n do
        begin
            pos:=i;
            val:=v[i];
            update(1,1,n);
        end;
end;

begin
    start:=0;finish:=0;pos:=0;val:=0;
    assign(stdin,'arbint.in');reset(stdin);
    assign(stdout,'arbint.out');rewrite(stdout);
    read(stdin,n,m);
    for i:=1 to n do
        read(stdin,v[i]);
    //for i:=0 to 400100 do arb[i]:=0;
    make;
    for i:=1 to m do
        begin
            read(stdin,x,a,b);
            if (x=0)then
                begin
                    maxim:=-1;
                    start:=a;
                    finish:=b;
                    querry(1,1,n);
                    writeln(stdout,maxim);
                end
            else
                begin
                    pos:=a;
                    val:=b;
                    update(1,1,n);
                end;
        end;
    close(stdin);
    close(stdout);
end.