#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; }
JOIOI上帝造题的七分钟(二维树状树组区间修改、区间查询)(2020.7.3)
原文:https://www.cnblogs.com/pengwenbangBlog/p/13231652.html