二维树状数组

Mobile phones http://poj.org/problem?id=1195

 1 #include<cstdio>
 2 #include<cstring>
 3 #define mt(a,b) memset(a,b,sizeof(a))
 4 const int M=1030;
 5 class Two_Tree_Array {  // 二维树状数组
 6     typedef int typev;
 7     typev c[M][M];
 8 public:
 9     void init() {
10         mt(c,0);
11     }
12     int lowb(int t) {
13         return t&(-t);
14     }
15     void add(int x,int y,typev v) {
16         for(int i=x; i<M; i+=lowb(i))
17             for(int j=y; j<M; c[i][j]+=v,j+=lowb(j));
18     }
19     typev sum(int x,int y) {
20         typev res=0;
21         for(int i=x; i>0; i-=lowb(i))
22             for(int j=y; j>0; res+=c[i][j],j-=lowb(j));
23         return res;
24     }
25     typev query(int x1,int y1,int x2,int y2) {
26         return sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1);
27     }
28 } gx;
29 int main(){
30     int op,l,b,r,t,n;
31     while(~scanf("%d",&op),op!=3){
32         if(!op){
33             scanf("%d",&n);
34             gx.init();
35         }
36         else if(op&1){
37             scanf("%d%d%d",&l,&b,&op);
38             gx.add(l+1,b+1,op);
39         }
40         else{
41             scanf("%d%d%d%d",&l,&b,&r,&t);
42             printf("%d\n",gx.query(l+1,b+1,r+1,t+1));
43         }
44     }
45     return 0;
46 }
View Code

 

 

 

 

end

posted on 2014-08-01 11:26  gaolzzxin  阅读(104)  评论(0编辑  收藏  举报