I and OI
Past...

题意:要求设计这样一个数据结构,支持下列操作

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.
posted on 2011-08-10 13:18  exponent  阅读(1168)  评论(0编辑  收藏  举报