题意:要求设计这样一个数据结构,支持下列操作
1.add(x,y,a).对二维数组的第x行,第y列加上a.
2.sum(l,b,r,t).求所有满足l<=x<=r,b<=y<=t,的数组元素的和.
显然,二维树状数组满足这些要求.
code:
var c:array[0..1025,0..1025] of longint; opt,n,x,y,a,l,b,r,t:longint; function lowbit(i:longint):longint; begin lowbit:=i and (i xor (i-1)); end; procedure change(x0,y0,a:longint); var x,y:longint; begin x:=x0; while x<=n do begin y:=y0; while y<=n do begin inc(c[x,y],a); inc(y,lowbit(y)); end; inc(x,lowbit(x)); end; end; function getsum(x0,y0:longint):longint; var x,y:longint; begin getsum:=0; x:=x0; while x>0 do begin y:=y0; while y>0 do begin inc(getsum,c[x,y]); dec(y,lowbit(y)); end; dec(x,lowbit(x)); end; end; function query(x1,y1,x2,y2:longint):longint; begin exit(getsum(x2,y2)-getsum(x2,y1-1)- getsum(x1-1,y2)+getsum(x1-1,y1-1)); end; begin readln(opt,n); while opt<>3 do begin read(opt); if opt=3 then halt; case opt of 1:begin readln(x,y,a); change(x+1,y+1,a); end; 2:begin readln(l,b,r,t); writeln(query(l+1,b+1,r+1,t+1)); end; end; end; end.