二维 Bit 0初始化,3结束,1设置数字,2求和,但是注意,输入的数据从 0 开始,我们需要基础上加一
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
const int maxm=1050;
#define ll long long int
const int low(int x){return x&-x;}
ll num[maxm][maxm]; int n,row,col;
inline void add(int x,int y,int k)
{
for(int i=x;i<=row;i+=low(i))
for(int j=y;j<=col;j+=low(j))
num[i][j] += k;
}
inline ll sum(int x,int y)
{
ll ans=0;
for(int i=x;i;i-=low(i))
for(int j=y;j;j-=low(j))
ans+=num[i][j];
return ans;
}
int main()
{
int op;
while(~scanf("%d",&op))
{
if(op==3)break;
if(op==0)
{
scanf("%d",&n);
row=col=n;
memset(num, 0, sizeof num);
}
if(op==1)
{
int x,y,t;
scanf("%d%d%d",&x,&y,&t);
add(x+1,y+1,t);
}
if(op==2)
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%lld\n",sum(x2+1,y2+1)+sum(x1,y1)-sum(x1,y2+1)-sum(x2+1,y1));
}
}
return 0;
}