题目描述
思路
二维树状数组板子题
代码
#include <cstdio>
#include <iostream>
using namespace std;
void read(int &n){
int num=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
num=num*10+ch-'0';
ch=getchar();
}
n=num*w;
}
const int maxn=10005;
int n,c[maxn][maxn];
int lowbit(int x){return x&(-x);}
void update(int x,int y,int v){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
c[i][j]+=v;
}
int query(int x,int y){
int ans=0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
ans+=c[i][j];
return ans;
}
int main(){
read(n);
while(1){
int m,x,y;read(m);
switch(m){
case 1:
int v;read(x);read(y);read(v);
update(x+1,y+1,v);
break;
case 2:
int x1,y1;read(x);read(y);read(x1);read(y1);
x++;y++;x1++;y1++;
printf("%d
",query(x1,y1)-query(x1,y-1)+query(x-1,y-1)-query(x-1,y1));
break;
case 3:
return 0;
}
}
return 0;
}