区间修改区间查询
题目链接:YbtOJ
解题思路
我们可以把区间修改区间查询的差分与单点修改区间查询结合起来,也就是二维树状数组维护二维前缀和再加上差分。
code
#include<iostream>
#include<cstdio>
#define lb(x) (x&(-x))
#define int long long
using namespace std;
int n,m,p;
int a,b,c,d,x;
int tree[2050][2050][5];
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][1]+=z;
tree[i][j][2]+=z*x;
tree[i][j][3]+=z*y;
tree[i][j][4]+=z*x*y;
}
}
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][1]*(x+1)*(y+1)-tree[i][j][2]*(y+1)-tree[i][j][3]*(x+1)+tree[i][j][4];
return s;
}
signed main()
{
cin>>n>>m;
while(scanf("%lld",&p)!=EOF)
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
if(p==1)
{
scanf("%lld",&x);
in(c+1,d+1,x);
in(c+1,b,-x);
in(a,d+1,-x);
in(a,b,x);
}
else
cout<<fd(c,d)-fd(c,b-1)-fd(a-1,d)+fd(a-1,b-1)<<endl;
}
}