Description:
给出一个 n
×
\times
× m的零矩阵 A,完成如下操作:
1 a b c d k : 表示左上角为(a,b),右下角为(c,d)的子矩阵内所有数自增k
2 x y : 表示询问Ax,y的值
代码:
// TSWorld
#include <bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i = l; i <= r;i++)
#define ll long long
const int N = 5005;
ll tree[N][N];
int n,m;
inline int lowbit(int x)
{
return x&(-x);
}
void Change(int x,int y,int delta) {
int temp_y = y;
while (x <= n) {
y = temp_y;
while(y <= m) {
tree[x][y] += delta;
y += lowbit(y);
}
x += lowbit(x);
}
}
void range_add(int x1,int y1,int x2,int y2,int delta) {
Change(x1,y1,delta);
Change(x1,y2+1,-delta);
Change(x2+1,y1,-delta);
Change(x2+1,y2+1,delta);
}
ll Query(int x,int y) {
ll sum = 0;
int temp_y = y;
while(x > 0) {
y = temp_y;
while(y > 0) {
sum += tree[x][y];
y -= lowbit(y);
}
x -= lowbit(x);
}
return sum;
}
int main()
{
int cmd = 0,x = 0,y = 0,k = 0;
int a = 0,b = 0,c = 0,d = 0;
cin>>n>>m;
while((scanf("%d",&cmd)) == 1) {
if(cmd == 1) {
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
//cout<<a<<"hello\n";
range_add(a,b,c,d,k);
}
else {
scanf("%d%d",&x,&y);
printf("%lld\n",Query(x,y));
}
}
return 0;
}