好像没啥好讲的
求sum-lowbit
修改+lowbit;
二维和一维差不多。。
Code :
一维:
function lowbit(x:longint):longint;
begin
exit(x and (-x));
end;
procedure add(x,data:longint);
begin
while (x<=n) do
begin
inc(c[x],data);
x:=x+lowbit(x);
end;
end;
function sum(x:longint):longint;
begin
sum:=0;
while x>0 do
begin
inc(sum,c[x]);
x:=x-lowbit(x);
end;
end;
procedure main;
begin
readln(n);
for i:=1 to n do
begin
readln(a[i]);
add(i,a[i]);
end;
end;
二维:
var c:array[0..1100,0..1100] of longint;
m,a,b,x,y,i,j,k,n:longint;
function lowbit(x:longint):longint;
begin
exit(x and (-x));
end;
procedure add(x,y,data:longint);
var y0:longint;
begin
y0:=y;
while (x<=n) do
begin
y:=y0;
while (y<=n) do
begin
inc(c[x,y],data);
y:=y+lowbit(y);
end;
x:=x+lowbit(x);
end;
end;
function sum(x,y:longint):longint;
var y0:longint;
begin
y0:=y;
sum:=0;
while (x>0) do
begin
y:=y0;
while (y>0) do
begin
inc(sum,c[x,y]);
y:=y-lowbit(y);
end;
x:=x-lowbit(x);
end;
end;