POJ1195 二维树状数组

题目大意

给一个初始全0的矩阵,操作1为将(i,j)处的元素加上k

操作2为输出子矩阵(a,b)(c,d)的所有元素和

操作3为结束程序

二维树状数组模板

唯一要注意的是题目中从0开始标号,所以要将所有的坐标都加1再进行操作

# include<iostream>
# include<cstdio>
# include<cmath>
# include<algorithm>
const int mn = 1035;
int n;
struct Binary_tree{
int tr[mn][mn];
void add(int x,int y,int val)
{
    for(int i=x;i<=n;i+=i&-i)
        for(int j=y;j<=n;j+=j&-j)
        tr[i][j]+=val;
}
int qsum(int x,int y)
{
    int ret=0;
   for(int i=x;i>0;i-=i&-i)
        for(int j=y;j>0;j-=j&-j)
        ret+=tr[i][j];
    return ret;
}
}A;
int main()
{
   int opt,a,b,c,d;
   scanf("%d%d",&opt,&n);
   while(1)
   {
       scanf("%d",&opt);
       if(opt==3)
        break;
       else if(opt==1)
       {
           scanf("%d%d%d",&a,&b,&c);
           A.add(a+1,b+1,c);
       }
       else {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        ++a,++b,++c,++d;
        printf("%d\n",A.qsum(c,d)+A.qsum(a-1,b-1)-A.qsum(c,b-1)-A.qsum(a-1,d));
       }
   }
   return 0;
}

 

posted @ 2018-05-06 13:42  logeadd  阅读(141)  评论(0编辑  收藏  举报