JOIOI上帝造题的七分钟
二维树状树组区间修改、区间查询
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m;
int a[2050][2050],t1[2050][2050],t2[2050][2050],t3[2050][2050],t4[2050][2050];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y,int v)
{
for(int i=x;i<=n;i+=lowbit(i))
{
for(int j=y;j<=m;j+=lowbit(j))
{
t1[i][j]+=v;
t2[i][j]+=v*x;
t3[i][j]+=v*y;
t4[i][j]+=v*x*y;
}
}
}
void addd(int x,int y,int x1,int y1,int v)
{
add(x,y,v);
add(x,y1+1,-v);
add(x1+1,y,-v);
add(x1+1,y1+1,v);
}
int ask(int x,int y)
{
int ans=0;
for(int i=x;i;i-=lowbit(i))
{
for(int j=y;j;j-=lowbit(j))
{
ans+=(x+1)*(y+1)*t1[i][j]-(y+1)*t2[i][j]-(x+1)*t3[i][j]+t4[i][j];
}
}
return ans;
}
int askk(int x,int y,int x1,int y1)
{
return ask(x1,y1)-ask(x1,y-1)-ask(x-1,y1)+ask(x-1,y-1);
}
int inline read()
{
int ans=0,f=1;
char ch=getchar();
if(ch==EOF) exit(0);
while(!isdigit(ch))
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(isdigit(ch))
{
ans=ans*10+ch-'0';
ch=getchar();
}
return ans*f;
}
char readchar()
{
char ch;
while (ch=getchar(),ch!=EOF && !isalpha(ch));
return ch;
}
void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x/10) write(x/10);
putchar(x%10+'0');
}
int main()
{
char ch;
int a,b,c,d,e;
readchar();
n=read();
m=read();
while(ch=readchar(),ch!=EOF)
{
a=read();
b=read();
c=read();
d=read();
if(ch=='L')
{
e=read();
addd(a,b,c,d,e);
}
else
{
write(askk(a,b,c,d));
putchar('\n');
}
}
return 0;
}