二维树状数组资源:https://www.cnblogs.com/ifmyt/p/9463837.html
题目:http://poj.org/problem?id=1195
要避免0 0 这个坐标 所以 将输入的横纵坐标都要+1
#include <iostream>
#include <cstdio>
#include <cstring>
#include<cmath>
using namespace std;
const int maxn = 1e3+50;
long n;
long c[maxn][maxn];
long lowbit(long x)
{
return x&(-x);
}
void update(long x, long y, long k)
{
long j;
while(x <=n)//第一维度
{
j = y;
while(j <= n)// 第二维度
{
c[x][j]+=k;
j+=lowbit(j);
}
x+=lowbit(x);
}
}
long getsum(long x, long y)
{
long res = 0;
long j;
while(x >= 1)//第一维度
{
j = y;
while(j>= 1)//第二维度
{
res+=c[x][j];
j-=lowbit(j);
}
x-=lowbit(x);
}
return res;
}
long sum(long x1, long y1, long x2, long y2)
{
int res;
res = getsum(x2, y2)- getsum(x1-1, y1-1)-(getsum(x2,y1-1)- getsum(x1-1, y1-1))- (getsum(x1-1,y2) - getsum(x1-1, y1-1));
return res;
}
int main()
{
long op;
while(1)
{
scanf("%ld", &op);
if(op == 3)break;
else if(op == 2)
{
long l, b, r,t;
scanf("%ld %ld %ld %ld", &l, &b, &r, &t);
r++;
t++;
l++;
b++;
long res = sum(l ,b , r, t);
printf("%ld\n", res);
}
else if(op == 1)
{
long x, y, a;
scanf("%ld %ld %ld", &x, &y, &a);
x++;
y++;
update(x, y, a);
}
else if(op == 0)
{
long s;
scanf("%ld", &s);
n = s;
}
}
return 0;
}