题意:一个s*s的矩阵,初始都是0,有若干次操作,要么增加某个元素的值,要么查询某个范围的和。
思路:二维树状数组模板题。。
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define ll long long
#define INF 1000000000
inline int lowbit(int x){
return x&(-x);
}
int s;
int c[1030][1030];
void update(int row,int col,int v){
int tcol=col;
while(row<=s){
col=tcol;
while(col<=s){
c[row][col]+=v;
col+=lowbit(col);
}
row+=lowbit(row);
}
}
int query(int row,int col){
int re=0;
int tcol=col;
while(row){
col=tcol;
while(col){
re+=c[row][col];
col-=lowbit(col);
}
row-=lowbit(row);
}
return re;
}
int main(){
int op;
while(scanf("%d",&op)){
if(op==3)break;
if(op==0){
scanf("%d",&s);
for(int i=1;i<=s;i++)
for(int j=1;j<=s;j++)
c[i][j]=0;
}
if(op==1){
int x,y,a;
scanf("%d%d%d",&x,&y,&a);
update(x+1,y+1,a);
}
if(op==2){
int l,b,r,t;
scanf("%d%d%d%d",&l,&b,&r,&t);
int ans=query(r+1,t+1)-query(r+1,b)-query(l,t+1)+query(l,b);
cout<<ans<<endl;
}
}
return 0;
}