树状数组处理区间需要化公式。。。
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
int n,m;
struct aa
{
int t[2050][2050];
void add(int x,int y,int tmp)
{
for (int i=x;i<=n;i+=i&-i)
for (int j=y;j<=m;j+=j&-j) t[i][j]+=tmp;
}
int sum(int x,int y)
{
int ans=0;
for (int i=x;i>0;i-=i&-i)
for (int j=y;j>0;j-=j&-j) ans+=t[i][j];
return ans;
}
}a,a_i,a_j,a_ij;
void add(int x,int y,int xx,int yy,int tmp)
{
a.add(x,y,tmp);
a.add(x,yy+1,-tmp);
a.add(xx+1,y,-tmp);
a.add(xx+1,yy+1,tmp);
a_j.add(x,y,y*tmp);
a_j.add(x,yy+1,(yy+1)*(-tmp));
a_j.add(xx+1,y,y*(-tmp));
a_j.add(xx+1,yy+1,(yy+1)*tmp);
a_i.add(x,y,x*tmp);
a_i.add(x,yy+1,x*(-tmp));
a_i.add(xx+1,y,(xx+1)*(-tmp));
a_i.add(xx+1,yy+1,(xx+1)*tmp);
a_ij.add(x,y,x*y*tmp);
a_ij.add(x,yy+1,x*(yy+1)*(-tmp));
a_ij.add(xx+1,y,(xx+1)*y*(-tmp));
a_ij.add(xx+1,yy+1,(xx+1)*(yy+1)*tmp);
}
int query(int x,int y)
{
return a.sum(x,y)*(x+1)*(y+1)-a_j.sum(x,y)*(x+1)-a_i.sum(x,y)*(y+1)+a_ij.sum(x,y);
}
int query(int x,int y,int xx,int yy)
{
return query(xx,yy)-query(xx,y-1)-query(x-1,yy)+query(x-1,y-1);
}
int main()
{
int x,y,xx,yy,tmp;
char ch[2];
scanf("%s",ch);
scanf("%d%d",&n,&m);
while (scanf("%s",ch)!=EOF)
{
scanf("%d%d%d%d",&x,&y,&xx,&yy);
if (ch[0]=='L') scanf("%d",&tmp),add(x,y,xx,yy,tmp);
else printf("%d\n",query(x,y,xx,yy));
}
return 0;
}