Cod sursa(job #528413)

Utilizator elffikkVasile Ermicioi elffikk Data 2 februarie 2011 19:40:32
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.22 kb
var A:array[1..100000] of longint;
   suma:longint;

procedure update(nod,st,dr,pos,val:longint);
var mij:longint;
begin
  if (st = dr)
  then
  begin
     dec(a[nod], val);
     exit;
  end;
  mij := (st + dr) div 2;
  if(pos <= mij)
  then update(nod*2, st, mij, pos, val)
  else update(nod*2 +1, mij+1, dr, pos, val);
  A[nod] := A[nod*2] + A[nod*2+1];
end;

procedure query(nod,st,dr,a1,b:longint);
var mij:longint;
begin
  if((a1 <= st) and (dr <= b))
  then begin
     inc(suma,A[nod]);
     exit;
  end;
  mij := (st + dr) div 2;
  if(a1 <= mij)
  then query(nod*2, st, mij, a1, b);
  if(b > mij)
  then query(nod*2+1, mij+1, dr, a1, b);
end;


var  N, M, i, x, a1, b, y:longint;
     f1, f2:text;
begin
   assign(f1, 'datorii.in');
   reset(f1);
   assign(f2, 'datorii.out');
   rewrite(f2);

   readln(f1, N, M);

   for i := 1 to N do
   begin
      read(f1, x);
      y := -x;
      update(1, 1, N, i, y);
   end;


   for i := 1 to M do
   begin
      read(f1, x, a1, b);
      if x = 1
      then begin
        suma := 0;
        query(1, 1, N, a1, b);
        writeln(f2, suma);
      end
      else update(1, 1, N, a1, b);
   end;
   close(f1);
   close(f2);
end.