这是一个典型的二维树状数组,也是模板题;
二维树状数组可以参考:点击打开链接
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1024;
int c[MAXN + 1][MAXN + 1];
int k, s;
int lowbit( int x )
{
return x & (-x);
}
void UFset(int x, int y, int data)
{
for(int i = x; i <= s; i += lowbit(i))
for(int j = y; j <= s; j += lowbit(j))
c[i][j] += data;
}
int GetSum(int x, int y)
{
int res = 0;
for(int i = x; i > 0; i -= lowbit(i))
for(int j = y; j > 0; j -= lowbit(j))
res += c[i][j];
return res;
}
int Querry(int x1, int y1, int x2, int y2)
{
return GetSum(x2, y2) - GetSum(x1 - 1, y2) - GetSum(x2, y1 - 1) + GetSum(x1 - 1, y1 - 1);
}
int main()
{
while(scanf("%d", &k) != EOF)
{
scanf("%d", &s);
memset(c, 0, sizeof(c));
while(scanf("%d", &k) == 1 && (k != 3))
{
if(k == 1)
{
int a, b, val;
scanf("%d %d %d", &a, &b, &val);
UFset(a+1, b+1, val);
}
else if(k == 2)
{
int x1, x2, y1, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
printf("%d\n",Querry(x1+1, y1+1, x2+1, y2+1));
}
}
}
return 0;
}