BZOJ2683传送门
BZOJ1176几乎一样啊
戳这里–>BZOJ1176
然后这个题 应 该? 要开long long 吧。
(日常打错变量名QAQ。。)
【代码】
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#define N 200005
#define M 800005
#define INF 1<<29
using namespace std;
typedef long long ll;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
int n,tot,numa;
ll ans[N],szsz[500005];
class Query{
public:
int type,x,y,w,id;
Query(){}
Query(int tt,int xx,int yy,int ww,int ii){
type=tt,x=xx,y=yy,w=ww,id=ii;
}
}Q[M],tmp[M];
bool operator <(Query a,Query b){
return a.x<b.x||(a.x==b.x&&a.type<b.type);
}
int lowbit(int x){return x&-x;}
void Sum_Up(int x,int y){
for(int i=x;i<=n;i+=lowbit(i)) szsz[i]+=y;
}
ll query(int x){
ll rtn=0;
for(int i=x;i;i-=lowbit(i)) rtn+=szsz[i];
return rtn;
}
void Clear(int x){
for(int i=x;i<=n&&szsz[i];i+=lowbit(i)) szsz[i]=0;
}
void CDQ(int l,int r)
{
if(l==r) return;
int mid=l+r>>1;CDQ(l,mid);CDQ(mid+1,r);
int p=l,q=mid+1,o=0;
while(p<=mid&&q<=r){
if(Q[p]<Q[q]) {
if(Q[p].type&1) Sum_Up(Q[p].y,Q[p].w);
tmp[o++]=Q[p++];
}
else {
if(Q[q].type==2) ans[Q[q].id]+=query(Q[q].y)*Q[q].w;
tmp[o++]=Q[q++];
}
}
while(p<=mid) tmp[o++]=Q[p++];
while(q<=r) {
if(Q[q].type==2) ans[Q[q].id]+=query(Q[q].y)*Q[q].w;
tmp[o++]=Q[q++];
}
for(int i=0;i<o;i++) Clear(tmp[i].y),Q[i+l]=tmp[i];
}
int main()
{
n=read();
while(1)
{
static int tp,x,y,xx,yy;
tp=read();if(tp==3) break;
x=read(),y=read(),xx=read();
if(tp&1) Q[++tot]=Query(tp,x,y,xx,0);
else {
yy=read();numa++;
Q[++tot]=Query(tp,x-1,y-1,1,numa);Q[++tot]=Query(tp,x-1,yy,-1,numa);
Q[++tot]=Query(tp,xx,y-1,-1,numa);Q[++tot]=Query(tp,xx,yy,1,numa);
}
}
CDQ(1,tot);
for(int i=1;i<=numa;i++) printf("%lld\n",ans[i]);
return 0;
}