Cod sursa(job #528893)

Utilizator gicu_01porcescu gicu gicu_01 Data 3 februarie 2011 19:05:49
Problema Datorii Scor 20
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.32 kb
var a:array[1..100]of longint;
    b:array[1..100000]of longint;
    c:array[1..100000]of longint;
    d:array[1..100000]of longint;
    n,m:longint;

procedure init;
var i,k:longint;
begin
 k:=1; a[0]:=1;
 for i:=1 to 14 do begin k:=k*2; a[i]:=k; end;
end;

procedure assd;
var i,j,pn:longint;
begin
 for i:=1 to 14 do
  begin
   j:=a[i];
   while j<=n+1 do
    begin
     inc(b[j]);
     j:=j+a[i];
    end;
  end;
end;

procedure vect;
var i,j,k:longint;
begin
 for i:=1 to n do
  begin
   k:=0;
   for j:=i-a[b[i]]+1 to i do k:=k+d[j];
   c[i]:=k;
  end;
 writeln;
end;

procedure modif(x,y:longint);
var i:longint;
begin
 while x<=n do
  begin
   c[x]:=c[x]-y;
   x:=x+a[b[x]];
  end;
end;

function sum(x:longint):longint;
var i,k:longint;
begin
 k:=0;
 while x>0 do
  begin
   k:=k+c[x];
   x:=x-a[b[x]];
  end;
 sum:=k;
end;

procedure citire;
var i,x,y,z:longint; f,t:text;
begin
 assign(f,'datorii.in');
 reset(f);
 assign(t,'datorii.out');
 rewrite(t);
 readln(f,n,m);
 for i:=1 to n do read(f,d[i]);
 init;
 assd;
 vect;
 readln(f);
 for i:=1 to m do
  begin
   readln(f,x,y,z);
   if x=0 then modif(y,z) else
   if (x=1)and(y=1)and(sum(z)>0) then writeln(t,sum(z)) else writeln(t,sum(z)-sum(y-1));
  end;
 close(t);
 close(f);
end;

begin
 citire;
end.