const max = 1024; // peab olema 2 aste

type
   elem = longint;
   mass = array [1..2*max-1] of elem;

// seame puu algseisu
procedure init(var a : mass);
var i : longint;
begin
   for i := 1 to 2 * max - 1 do
      a[i] := 0;
end;

// muudame ühe elemendi väärtust, uuendame kõik vahesummad juureni
procedure setv(var a : mass; i : longint; x : elem);
begin
   i := i + max - 1;
   x := x - a[i];
   while i >= 1 do begin
      a[i] := a[i] + x;
      i := i div 2;
   end;
end;

// leiame lõigu summa
function sumv(var a : mass; i, j : longint) : longint;
   // leiame lõigu i..j summa selle osa,
   // mis on tipust k algavas alampuus,
   // mis katab massiivi osa ii..jj
   function sumx(i, j : longint; k, ii, jj : longint) : longint;
   var m : longint;
   begin
      if (j < ii) or (i > jj) then
         exit(0);
      if i < ii then
         i := ii;
      if j > jj then
         j := jj;
      if (i = ii) and (j = jj) then
         exit(a[k]);
      m := (ii + jj) div 2;
      exit(sumx(i, j, 2 * k, ii, m) + sumx(i, j, 2 * k + 1, m + 1, jj));
   end;
begin
   exit(sumx(i, j, 1, 1, max));
end;

var a : mass; n, i, x, j, s1, s2 : longint;
begin
   init(a);
   for n := 1 to 1000000 do begin
      // muudame juhuslikult valitud elementi
      i := 1 + random(max);
      x := random(100);
      setv(a, i, x);
      // kontrollime summasid
      if sumv(a, i, i) <> x then
         writeln(i, ' ', x, ' ', i, '-', i);
      s1 := 0;
      for j := 1 to i do
         s1 := s1 + a[max - 1 + j];
      if sumv(a, 1, i) <> s1 then
         writeln(i, ' ', x, ' ', 1, '-', i);
      s2 := 0;
      for j := i to max do
         s2 := s2 + a[max - 1 + j];
      if sumv(a, i, max) <> s2 then
         writeln(i, ' ', x, ' ', i, '-', max);
      if sumv(a, 1, max) <> s1 + s2 - x then
         writeln(i, ' ', x, ' ', 1, '-', max);
   end;
end.
