Cod sursa(job #1582148)

Utilizator Andreea1864Andreea Oancea Andreea1864 Data 27 ianuarie 2016 18:13:48
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.37 kb
type sir=array[1..15000] of integer;
var f,g:text;
    a,aib:sir;
    m,i:longint;
    n,v,t,p,q:integer;

function exp(i:integer):integer;
var k:integer;
begin
k:=0;
while i mod 2=0 do begin
      i:=i div 2;
      inc(k);
end;
exp:=k;
end;

function suma(x:integer):longint;
var s:longint;
begin
s:=0;
write(x,' : ');
while x>0 do begin
      s:=s+aib[x];
      x:=x and (x-1);
end;
suma:=s;
end;

procedure formare;
var k,j:integer;
begin
for i:=1 to n do
    if i mod 2=1 then aib[i]:=a[i]
       else begin
       k:=exp(i);
       if k=1 then aib[i]:=a[i]+a[i-1]
          else if k=2 then for j:=i downto i-3 do
                               aib[i]:=aib[i]+a[j]
          else aib[i]:=a[i]+suma(i-1);
       end;
end;


procedure achitare(t,v:integer;var aib:sir);
begin
repeat
      aib[t]:=aib[t]-v;
      t:=t+(t and (-t));
until t>n;
end;



procedure citire(var n:integer;var m:longint;var a:sir);
var c:byte;
begin
assign(f,'datorii.in');reset(f);
assign(g,'datorii.out');rewrite(g);
read(f,n,m);
for i:=1 to n do
    read(f,a[i]);
formare;
for i:=1 to m do begin
    read(f,c);
    if c=0 then begin
       read(f,t,v);
       achitare(t,v,aib);
       end;
    if c=1 then begin
       read(f,p,q);
       writeln(g,suma(q)-suma(p-1))
       end;
end;
close(f);
close(g);
end;

begin
citire(n,m,a);
end.