BZOJ1176
来自蒟蒻XXJ的做题记录
CDQ裸题 入门……
#include<bits/stdc++.h>
using namespace std;
const int MAXQ=160010+10010*4;
const int MAXN=2000010;
typedef long long ll;
inline int in(){
int a(0);char c=getchar();
while(c<'0'||c>'9') c-getchar();
while(c>='0'&&c<='9') a=(a<<1)+(a<<3)+c-'0',c=getchar();
return a;
}
int s,w;
int cnt,sum;
struct QUE{
int x,y,d,typ;
long long tot;
int k,id;
}que[MAXQ];
ll ans[MAXQ];
ll tree[MAXN];
bool hash[MAXQ];
void change(int pos,int k){
for(int i=pos;i<=w;i+=(i&-i)) tree[i]+=k;
}
ll ask(int pos){
int res(0);
for(int i=pos;i;i-=(i&-i)) res+=tree[i];
return res;
}
void update(int i){
que[i].tot=(ll)que[i].x*que[i].y*s;
}
void input(){
s=in();w=in();
for(;;){
int tmp=in();
if(tmp==3) break;++sum;
if(tmp==1){
que[++cnt].x=in();
que[cnt].y=in();
que[cnt].d=in();
que[cnt].typ=0;
}
if(tmp==2){
int x1,y1,x2,y2;
x1=in();y1=in();x2=in();y2=in();
que[++cnt].x=x1-1;que[cnt].y=y1-1;que[cnt].typ=1;update(cnt);que[cnt].id=sum;que[cnt].k=1;
que[++cnt].x=x2;que[cnt].y=y2;que[cnt].typ=1;update(cnt);que[cnt].id=sum;que[cnt].k=1;
que[++cnt].x=x1-1;que[cnt].y=y2;que[cnt].typ=1;update(cnt);que[cnt].id=sum;que[cnt].k=-1;
que[++cnt].x=x2;que[cnt].y=y1-1;que[cnt].typ=1;update(cnt);que[cnt].id=sum;que[cnt].k=-1;
hash[sum]=1;
}
}
}
bool cmp1(QUE xx,QUE yy){
if(xx.typ==yy.typ&&xx.x==yy.x) return xx.y<yy.y;
else if(xx.typ==yy.typ) return xx.x<yy.x;
return xx.typ<yy.typ;
}
bool cmp2(QUE xx,QUE yy){
if(xx.typ==yy.typ&&xx.x==yy.x) return xx.y<yy.y;
else if(xx.typ==yy.typ) return xx.x<yy.x;
return xx.typ>yy.typ;
}
void solve(int l,int r){
if(l==r) return;
int mid=(l+r)>>1;
solve(l,mid);
solve(mid+1,r);
sort(que+l,que+mid+1,cmp1);
sort(que+mid+1,que+r+1,cmp2);
int i=l,j=mid+1;
while(j<=r&&que[j].typ){
while(i<=mid&&!que[i].typ&&que[i].x<=que[j].x){
change(que[i].y,que[i].d);i++;
}
que[j].tot+=ask(que[j].y);
++j;
}
for(int tmp=l;tmp<i;tmp++) change(que[tmp].y,-que[tmp].d);
}
void xxj(){
solve(1,cnt);
}
void output(){
for(int i=1;i<=cnt;i++){
if(!que[i].typ) continue;
ans[que[i].id]+=que[i].k*que[i].tot;
}
for(int i=1;i<=sum;i++){
if(!hash[i]) continue;
cout<<ans[i]<<endl;
}
}
int main(){
input();
xxj();
output();
return 0;
}