Cod sursa(job #195916)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 23 iunie 2008 12:17:02
Problema Arbori de intervale Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 2.48 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,left,mid);
             if (mid<finish)then
                    querry(2*nod+1,mid+1,right);
         end;
end;
       {
function max(a,b:integer):integer;
begin
    if (a>b)then
        maxim:=a;
    if (a<=b)then
        maxim:=b;
end;
      }
procedure update(nod,left,right:longint);
var mid,max:longint;
begin
    mid:=(left+right)div 2;
    if (left=right)then
        begin
            arb[nod]:=val;
        end
    else
        begin
             if (pos<=mid)then
                update(2*nod,left,mid)
             else
                 begin
                      update(2*nod+1,mid+1,right);
                 end;
             max:=arb[2*nod];
             if (arb[2*nod+1]>max)then
                max:=arb[2*nod+1];
             arb[nod]:=max;
             //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;maxim:=0;
    for i:=1 to 400000 do arb[i]:=0;
    assign(stdin,'arbint.in');reset(stdin);
    assign(stdout,'arbint.out');rewrite(stdout);
    read(stdin,n,m);
    for i:=1 to n do
        begin
             read(stdin,x);
             pos:=i;
             val:=x;
             update(1,1,n);
        end;
    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 if (x=1)then
                begin
                    pos:=a;
                    val:=b;
                    update(1,1,n);
                end;
        end;
    close(stdin);
    close(stdout);
end.