cdq 分治模板题
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxq = 200005;
struct query{
int x,y,op,v,id;
query( int _x=0,int _y=0,int _id=0,int _op=0,int _v=0 ){
x = _x;y = _y;op = _op;v = _v;id=_id;
}
}Q[4*maxq],tmp[4*maxq];
vector<int> ve;
void discrete(){
sort( ve.begin(),ve.end() );
ve.erase( unique( ve.begin(),ve.end() ),ve.end() );
}
int h( int x ){
return lower_bound( ve.begin(),ve.end(),x ) - ve.begin()+1;
}
int b[4*maxq],limit=4*maxq;
int lowbit( int x ){return x&-x;}
void add( int x,int v ){
while( x<=limit ){
b[x] += v;
x += lowbit(x);
}
}
LL ask( int x ){
LL res = 0;
while(x){
res += b[x];
x -= lowbit(x);
}
return res;
}
LL ans[maxq];
void cdq( int l,int r ){
if( l >= r ) return;
int mid = l+r>>1;
cdq( l,mid );
cdq( mid+1,r );
int p1 = l,p2 = mid+1;
int tot = l;
while( p1 <= mid || p2 <= r ){
if( p1 > mid || (p2<=r && Q[p1].x > Q[p2].x ) ){
if( Q[p2].op==1 ){
ans[ Q[p2].id ] += 1LL * Q[p2].v * ask( h( Q[p2].y ) );
}
tmp[tot++] = Q[p2++];
}else{
if( Q[p1].op == 0 ){
int y = h( Q[p1].y );
add( y,Q[p1].v );
}
tmp[tot++] = Q[p1++];
}
}
for( int i = l;i <= mid;i++ ){
if( Q[i].op==0 ) {
int y = h( Q[i].y );
add( y,-Q[i].v );
}
}
for( int i = l;i <= r;i++ ){
Q[i] = tmp[i];
}
}
int main(){
int s,w,op,q = 0,x,y,a,x2,y2,id = 0;
scanf("%d%d",&s,&w);
while( 1==scanf("%d",&op) && op != 3 ){
++id;op--;
if( op == 0 ){
scanf("%d%d%d",&x,&y,&a);
Q[++q] = query( x,y,id,op,a );
ve.push_back(y);
ans[id] = -1;
}else if( op == 1 ){
scanf("%d%d%d%d",&x,&y,&x2,&y2);
Q[++q] = query( x-1,y-1,id,op,1 );
Q[++q] = query( x-1,y2,id,op,-1 );
Q[++q] = query( x2,y-1,id,op,-1 );
Q[++q] = query( x2,y2,id,op,1 );
ve.push_back(y-1 );ve.push_back(y2);
ans[id] = 1LL*(x2-x+1) *( y2-y+1 )*s ;
}
}
discrete();
cdq(1,q);
for( int i = 1;i <= id;i++ ){
if( ans[i]==-1 ) continue;
printf("%lld\n",ans[i]);
}
return 0;
}