Cod sursa(job #152858)

Utilizator dobreDobre Catalin Andrei dobre Data 9 martie 2008 21:05:36
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.25 kb
program datorii; {N<15000 M<100000}
var v:array[1..45000]of longint;
    n,m:longint;
    z,a,b:longint;
    i:longint;
    f,g:text;

function maxim(a,b:longint):longint;
begin
maxim:=(a+b+abs(a-b))shr 1;
end;

procedure update(n,st,dr,poz,val:longint);
var mij:longint;
begin
if(st=dr)then v[n]:=v[n]+val
else begin
      mij:=(st+dr) shr 1;
      if poz<=mij then update(n shl 1,st,mij,poz,val);
      if poz>mij then update(n shl 1 +1,mij+1,dr,poz,val);
      v[n]:=v[n shl 1]+v[n shl 1 +1];
     end;
end;

function query(n,st,dr,a,b:longint):longint;
var mij:longint;
    ll,rr:longint;
begin
if (a<=st)and(dr<=b) then query:=v[n]
else begin
      mij:=(st+dr) shr 1;
      ll:=0;rr:=0;
      if a<=mij then ll:=query(n shl 1,st,mij,a,b);
      if b>mij then rr:=query(n shl 1 +1,mij+1,dr,a,b);
      query:=ll+rr;
     end;
end;

procedure read_input;
var val:longint;
begin
for i:=1 to n do begin
     read(f,val);
     update(1,1,n,i,val);
    end;
end;


begin
assign(f,'datorii.in');reset(f);
assign(g,'datorii.out');rewrite(g);
readln(f,n,m);
read_input;
for i:=1 to m do begin
     readln(f,z,a,b);
     if z=0 then update(1,1,n,a,-b)
        else writeln(g,query(1,1,n,a,b));
    end;
close(f);
close(g);
end.