Cod sursa(job #343005)

Utilizator ionutz32Ilie Ionut ionutz32 Data 24 august 2009 16:47:16
Problema Arbori indexati binar Scor 60
Compilator fpc Status done
Runda Arhiva educationala Marime 1.99 kb
var v:array[1..200000] of longint;
n,i,x,m,a,b,c,s:longint;
f,g:text;
procedure update(poz,val,lo,hi,nr:longint);
          var mid:longint;
          begin
          if lo=hi then
             inc(v[nr],val)
          else
              begin
              mid:=lo+(hi-lo) shr 1;
              if poz<=mid then
                 update(poz,val,lo,mid,nr*2)
              else
                  update(poz,val,mid+1,hi,nr*2+1);
              v[nr]:=v[nr]+val;
              end;
          end;
procedure sum(x,y,lo,hi,nr:longint);
          var mid:longint;
          begin
          if (x<=lo) and (hi<=y) then
             s:=s+v[nr]
          else
              begin
              mid:=lo+(hi-lo) shr 1;
              if x<=mid then
                 sum(x,y,lo,mid,nr*2);
              if y>mid then
                 sum(x,y,mid+1,hi,nr*2+1);
              end;
          end;
procedure pr3(si,lo,hi,nr:longint);
          var mid:longint;
          begin
          if lo=hi then
             begin
             if si+v[nr]=b then
                s:=lo
             else
                 s:=-1;
             end
          else
              begin
              mid:=lo+(hi-lo) shr 1;
              if si+v[2*nr]>=b then
                 pr3(si,lo,mid,nr*2)
              else
                  pr3(si+v[nr*2],mid+1,hi,nr*2+1);
              end;
          end;
begin
assign(f,'aib.in');
assign(g,'aib.out');
reset(f);rewrite(g);
readln(f,n,m);
for i:=1 to n do
    begin
    read(f,x);
    update(i,x,1,n,1);
    end;
readln(f);
for i:=1 to m do
    begin
    read(f,a,b);
    case a of
         0:begin
           readln(f,c);
           update(b,c,1,n,1);
           end;
         1:begin
           s:=0;
           readln(f,c);
           sum(b,c,1,n,1);
           writeln(g,s);
           end;
         2:begin
           readln(f);
           pr3(0,1,n,1);
           writeln(g,s);
           end;
         end;
    end;
close(f);close(g);
end.