树状数组改段求段。。
The "Large Sweet Matrix" playing field is an n × m matrix. Let's number the rows of the matrix from 1 ton, and the columns — from 1 to m. Let's denote the cell in the i-th row and j-th column as (i, j). Each cell of the matrix can contain multiple candies, initially all cells are empty. The game goes in w moves, during each move one of the two following events occurs:
Unfortunately, Sereja's matrix is really huge. That's why Inna and Dima aren't coping with the calculating. Help them!
The first line of the input contains three integers n, m and w (3 ≤ n, m ≤ 4·106; 1 ≤ w ≤ 105).
The next w lines describe the moves that were made in the game.
It is guaranteed that the second type move occurs at least once. It is guaranteed that a single operation will not add more than 109 candies.
Be careful, the constraints are very large, so please use optimal data structures. Max-tests will be in pretests.
For each second type move print a single integer on a single line — the difference between Dima and Inna's numbers.
4 5 5
0 1 1 2 3 2
0 2 2 3 3 3
0 1 5 4 5 1
1 2 3 3 4
1 3 4 3 4
2
-21
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define ll long long #define prt(k) cout<<#k"="<<k<<" "; #define N 4000050 ll b[N][2],c[N][2]; int lowbit(int x) { return x&-x; } int n,m; void add(int p,ll v,int t) { if(p==0) return; for(int i=p;i;i-=lowbit(i)) b[i][t]+=v; for(int i=p;i<N;i+=lowbit(i)) c[i][t]+=v*p; } ll sumb(int p,int t) { ll ret=0; for(int i=p;i<N;i+=lowbit(i)) ret+=b[i][t]; return ret; } ll sumc(int p,int t) { ll ret=0; for(int i=p;i;i-=lowbit(i)) ret+=c[i][t]; return ret; } ll sum(int x,int t) { if(x==0) return 0; return sumb(x,t)*x+sumc(x-1,t); } int w; int main() { cin>>n>>m>>w; for(int i=0;i<w;i++) { int o,x1,y1,x2,y2; ll v; scanf("%d%d%d%d%d",&o,&x1,&y1,&x2,&y2); if(o==0) { scanf("%lld",&v); ll a=y2-y1+1,b=x2-x1+1; add(x2,v*a,0); add(x1-1,-v*a,0); add(y2,v*b,1); add(y1-1,-v*b,1); } else { ll a=sum(x1-1,0); ll b=sum(n,0)-sum(x2,0); ll c=sum(y1-1,1); ll d=sum(m,1)-sum(y2,1); ll ans=sum(n,0)-a-b-c-d; // prt(sum(m,1)); prt(a); prt(b); prt(c); prt(d); puts(""); printf("%lld\n",ans); } } }