单点修改区间查询
题目链接:YbtOJ
解题思路
模板题,二维树状数组维护前缀和。
code
#include<iostream>
#include<cstdio>
#define lb(x) (x&(-x))
#define int long long
using namespace std;
int n,m,q;
int x,y,k;
int a,b,c,d;
int tree[5010][5010];
void in(int x,int y,int z)
{
for(int i=x;i<=n;i+=lb(i))
for(int j=y;j<=m;j+=lb(j))
tree[i][j]+=z;
}
int fd(int x,int y)
{
int s=0;
for(int i=x;i;i-=lb(i))
for(int j=y;j;j-=lb(j))
s+=tree[i][j];
return s;
}
signed main()
{
cin>>n>>m;
while(scanf("%lld",&q)!=EOF)
{
if(q==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
in(x,y,k);
}
else
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
cout<<fd(c,d)-fd(a-1,d)-fd(c,b-1)+fd(a-1,b-1)<<endl;
}
}
}