Cod sursa(job #1210694)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 20 iulie 2014 20:55:24
Problema Datorii Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.67 kb
program datorii;
  var bufin,bufout:array[1..100000] of byte;
      n,m,i,op,x,y:longint;
      a:array[1..15000] of longint;
      t:array[1..60000] of longint;

function min(u,v:longint):longint;
  begin
    if u>v then min:=v else min:=u;
  end;

function max(u,v:longint):longint;
  begin
    if u<v then max:=v else max:=u;
  end;

procedure build(nod,tl,tr:longint);
  var tm:longint;
  begin
    if tl=tr then t[nod]:=a[tl] else
      begin
        tm:=(tl+tr) shr 1;
        build(nod shl 1,tl, tm);
        build(nod shl 1+1,tm+1,tr);
        t[nod]:=t[nod shl 1]+t[nod shl 1+1];
      end;
  end;

procedure update(nod,tl,tr,pos,val:longint);
  var tm:longint;
  begin
    if tl=tr then t[nod]:=t[nod]-val else
      begin
        tm:=(tl+tr) shr 1;
        if pos<=tm then update(nod shl 1,tl,tm,pos,val)
                   else update(nod shl 1+1,tm+1,tr,pos,val);
        t[nod]:=t[nod]-val;
      end;
  end;

function query(nod,tl,tr,l,r:longint):longint;
  var tm:longint;
  begin
    if l>r then query:=0 else
    if (l=tl)and(r=tr) then query:=t[nod] else
      begin
        tm:=(tl+tr)shr 1;
        query:=query(nod shl 1,tl,tm,l,min(r,tm))+
               query(nod shl 1+1,tm+1,tr,max(tm+1,l),r);
      end;
  end;

begin
  assign(input,'datorii.in');
  reset(input);
  settextbuf(input,bufin);
  assign(output,'datorii.out');
  rewrite(output);
  settextbuf(output,bufout);

  readln(n,m);
  for i:=1 to n do read(a[i]); readln;

  build(1,1,n);

  for i:=1 to m do
    begin
      readln(op,x,y);
      if op=0 then update(1,1,n,x,y)
              else writeln(query(1,1,n,x,y));
    end;
  close(output);
end.