就是一道树状数组二维区间修改,单点查询的板子题。
#include<bits/stdc++.h>
using namespace std;
long long tree[5000][5000];
int n,m;
void add(int x, int y, int z){
int memo_y = y;
while(x <= n){
y = memo_y;
while(y <= n)
tree[x][y] += z, y += y & -y;
x += x & -x;
}
}
void range_add(int xa, int ya, int xb, int yb, int z){
add(xa, ya, z);
add(xa, yb + 1, -z);
add(xb + 1, ya, -z);
add(xb + 1, yb + 1, z);
}
long long ask(int x, int y){
long long res = 0, memo_y = y;
while(x){
y = memo_y;
while(y)
res += tree[x][y], y -= y & -y;
x -= x & -x;
}
return res;
}
int main()
{
int op;
cin>>n>>m;
while(cin>>op){
if(op==1){
int x,y,a,b,k;
cin>>x>>y>>a>>b>>k;
range_add(x,y,a,b,k);
}
else if(op==2){
int x,y;
cin>>x>>y;
cout<<ask(x,y)<<'\n';
}
}
}