Pagini recente » Cod sursa (job #1569728) | Cod sursa (job #2180949) | Cod sursa (job #2443417) | Cod sursa (job #285958) | Cod sursa (job #526534)
Cod sursa(job #526534)
var a:array[0..14]of longint;
b:array[0..14,1..100000]of longint;
n,m:longint;
procedure putere;
var i:byte;
begin
a[0]:=1;
for i:=1 to 14 do a[i]:=a[i-1]*2;
end;
procedure matrice;
var i,j:longint;
begin
for i:=1 to 13 do
if a[i]<n then
begin
for j:=1 to n do
if j+a[i-1]<=n then b[i,j]:=b[i-1,j]+b[i-1,j+a[i-1]] else b[i,j]:=b[i-1,j];
end else break;
end;
function interval(x,y:longint):longint;
var k,p,i:longint;
begin
k:=y-x+1; p:=0;
for i:=14 downto 0 do
begin
if k div a[i]=1 then begin p:=p+b[i,x]; k:=k mod a[i]; x:=x+a[i]; end;
if k=0 then break;
end;
interval:=p;
end;
procedure scadere(x,y:longint);
var k,p,i,j:longint;
begin
i:=0;k:=x;
while k>1 do
begin
k:=x-a[i]+1;
b[i,k]:=b[i,k]-y;
inc(i);
end;
j:=1; p:=x;
while p>1 do
begin
p:=x-a[j]+2;
b[j,p]:=b[j,p]-y;
inc(j);
end;
end;
procedure citire;
var i,x,y,z:longint;f,t:text;
begin
assign(f,'datorii.in');
reset(f);
readln(f,n,m);
for i:=1 to n do read(f,b[0,i]);
readln(f);
matrice;
assign(t,'datorii.out');
rewrite(t);
for i:=1 to m do
begin
readln(f,x,y,z);
if x=0 then scadere(y,z) else writeln(t,interval(y,z));
end;
close(t);
close(f);
end;
begin
putere;
citire;
end.