传送门
调了半天发现是输出优化打错了求心理阴影体积233
这题很简单啊。
一个修改操作x如果对一个询问操作y有贡献那么有。
tx<ty,Xx<=Xy,Yx<=Yy" role="presentation" style="position: relative;">tx<ty,Xx<=Xy,Yx<=Yytx<ty,Xx<=Xy,Yx<=Yy,其中t是时间,X,Y是坐标,这就是一个普通的三维偏序了。
代码:
#include<bits/stdc++.h>
#define N 650000
#define M 2000005
#define K 10005
using namespace std;
struct Pot{int x,y,z,t,id,f;}q[N+K],tmp[N+K];
int n,s,k,m,bit[M],ans[K];
inline int read(){
int ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*w;
}
inline void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar((x%10)^48);
}
inline int lowbit(int x){return x&-x;}
inline void update(int x,int v){for(int i=x;i<=n;i+=lowbit(i))bit[i]+=v;}
inline int query(int x){int ret=0;for(int i=x;i;i-=lowbit(i))ret+=bit[i];return ret;}
inline void solve(int l,int r){
if(l==r)return;
int mid=l+r>>1,pos1=l,pos2=mid+1;
for(int i=l;i<=r;++i){
if(q[i].t<=mid&&!q[i].f)update(q[i].y,q[i].z);
if(q[i].t>mid&&q[i].f)ans[q[i].id]+=q[i].z*query(q[i].y);
}
for(int i=l;i<=r;++i)if(q[i].t<=mid&&!q[i].f)update(q[i].y,-q[i].z);
for(int i=l;i<=r;++i)
if(q[i].t<=mid)tmp[pos1++]=q[i];
else tmp[pos2++]=q[i];
for(int i=l;i<=r;++i)q[i]=tmp[i];
solve(l,mid),solve(mid+1,r);
}
inline bool cmp(Pot a,Pot b){return a.x<b.x||(a.x==b.x&&a.y<b.y)||(a.x==b.x&&a.y==b.y&&a.f<b.f);}
int main(){
s=read(),n=read();
int op;
while((op=read())!=3){
int x=read(),y=read(),z=read();
if(op==1)q[++k]=(Pot){x,y,z,k,m,0};
else{
int w=read();
++m,--x,--y;
q[++k]=(Pot){x,y,1,k,m,1};
q[++k]=(Pot){x,w,-1,k,m,1};
q[++k]=(Pot){z,y,-1,k,m,1};
q[++k]=(Pot){z,w,1,k,m,1};
}
}
sort(q+1,q+k+1,cmp),solve(1,k);
for(int i=1;i<=m;++i)write(ans[i]),puts("");
return 0;
}