Cod sursa(job #195926)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 23 iunie 2008 12:37:18
Problema Arbori de intervale Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 2.58 kb
program arbint;
var
    v:array[0..100010]of longint;
    stdin,stdout:text;
    a,b,x,i,n,m:longint;
    start, finish, val, pos, maxim,nr,aux,poz:longint;
    arb:array[0..400100]of longint;
    s:array[0..1000000]of char;
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;

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;
        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);
    readln(stdin);  nr:=0;
    while (not eoln(stdin))do
          begin
               read(stdin,s[nr]);
               inc(nr);
          end;
    aux:=0;poz:=0;
    for i:=0 to nr-1 do
        begin
             if (s[i]=' ')then
                begin
                     inc(poz);
                     v[poz]:=aux;
                     aux:=0;
                end
             else
                 aux:=aux*10+ord(s[i])-ord('0');
         end;
    inc(poz);
    v[poz]:=aux;
    for i:=1 to n do
        begin
             pos:=i;
             val:=v[i];
             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.