Cod sursa(job #177969)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 13 aprilie 2008 22:13:08
Problema Arbori indexati binar Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.4 kb
program aib;
var A : array [1..300000] of longint;
    B : array [1..100000] of longint;
    i,n,m,S,p1,p2,j : longint;
    x : shortint;
    f,g : text;

procedure update(nod,l,r,poz,val:longint);
var mij : longint;
begin
if r=l then A[nod] := A[nod]+val
else begin
        mij := (r+l) div 2;
        if poz<=mij then update(2*nod,l,mij,poz,val)
                    else update(2*nod+1,mij+1,r,poz,val);
        A[nod] := A[2*nod]+A[2*nod+1];
        end;
end;

procedure query(nod,l,r,p1,p2:longint);
var mij : longint;
begin
if (p1<=l) and (r<=p2) then S := S+A[nod]
else begin
        mij := (r+l) div 2;
        if p1<=mij then query(2*nod,l,mij,p1,p2);
        if mij<p2 then query(2*nod+1,mij+1,r,p1,p2);
        end;
end;


begin
assign(f,'aib.in');
reset(f);
assign(g,'aib.out');
rewrite(g);

readln(f,n,m);

for i := 1 to n do A[i] := 0;

for i := 1 to n do begin
read(f,B[i]);
update(1,1,n,i,B[i]);
end;
readln(f);


for i := 1 to m do begin
read(f,x);
case x of
0: begin
   readln(f,p1,p2);
   update(1,1,n,p1,p2);
   B[p1] := B[p1]+p2;
   end;
1: begin
   readln(f,p1,p2);
   S := 0;
   query(1,1,n,p1,p2);
   writeln(g,S);
   end;
2: begin
   readln(f,p1);
   S := 0;

   j := 0;
   repeat
   j := j+1;
   S := S+B[j];
   until S>=p1;

   if S=p1 then writeln(g,j)
           else writeln(g,'-1');

   end;
end;
end;
close(f);
close(g);
end.