二维的区间加区间查询,稍微推一下式子就好……
反正就长那样
我当时肯定没睡醒……喵的……推得都是些什么鬼啊QAQ
struct似乎是会跑得快一点……?反正我这个写法慢的一比……
#include<bits/stdc++.h>
#define MAXN 2100
using namespace std; int n,m;
struct Tree_Array{
int sum[MAXN][MAXN];
void add(int x,int y,int k){
for(int i=x;i<=n;i+=i&-i)
for(int j=y;j<=m;j+=j&-j)
sum[i][j]+=k;
}
int inqry(int x,int y){
int rtn=0;
for(int i=x;i;i-=i&-i)
for(int j=y;j;j-=j&-j)
rtn+=sum[i][j];
return rtn;
}
}D,ID,JD,IJD;
void modify(){
int x,y,xx,yy;
int k;
scanf("%d%d%d%d%d",&x,&y,&xx,&yy,&k);
D.add(x,y,k),D.add(xx+1,yy+1,k),D.add(x,yy+1,-k),D.add(xx+1,y,-k);
ID.add(x,y,k*x),ID.add(xx+1,yy+1,k*(xx+1)),ID.add(x,yy+1,-k*x),ID.add(xx+1,y,-k*(xx+1));
JD.add(x,y,k*y),JD.add(xx+1,yy+1,k*(yy+1)),JD.add(x,yy+1,-k*(yy+1)),JD.add(xx+1,y,-k*y);
IJD.add(x,y,k*x*y),IJD.add(xx+1,yy+1,k*(xx+1)*(yy+1)),IJD.add(x,yy+1,-k*x*(yy+1)),IJD.add(xx+1,y,-k*(xx+1)*y);
/*
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
printf("%d ",IJD.inqry(i,j));
puts("\n");
}
*/
}
int calc(int x,int y){
// printf("\nx = %d y = %d\n",x,y);
// printf("%d %d %d %d\n",D.inqry(x,y),IJD.inqry(x,y),ID.inqry(x,y),JD.inqry(x,y));
return (x+1)*(y+1)*D.inqry(x,y)+IJD.inqry(x,y)-(1+y)*ID.inqry(x,y)-(1+x)*JD.inqry(x,y);
}
void inqry(){
int x,y,xx,yy;
scanf("%d%d%d%d",&x,&y,&xx,&yy);
// printf("%d %d %d %d\n",calc(xx,yy),calc(x-1,y-1),calc(x-1,yy),calc(xx,y-1));
printf("%d\n",calc(xx,yy)+calc(x-1,y-1)-calc(x-1,yy)-calc(xx,y-1));
}
int opt[4];
int main(){
scanf("%s%d%d",opt,&n,&m);
while(~scanf("%s",opt))
if(opt[0]=='L') modify(); else inqry();
return 0;
}