$CDQ$分治。
考虑此时在区间$[l,r]$中,要计算$[l,mid]$中的操作对$[mid+1,r]$中的询问的影响。
计算时,排序加上树状数组即可。
然后再递归处理$[l,mid]$和$[mid+1,r]$。
#include#include #include using namespace std; const int MAX=2000005;struct data{ int opt,x,y,y1,w,num; data(int a=0,int b=0,int c=0,int d=0,int e=0,int f=0) {opt=a,x=b,y=c,y1=d,w=e,num=f;}}s[200005],g[200005];bool cmp(data u,data v) { return (u.x==v.x)?(u.opt >1; CDQ(l,mid),CDQ(mid+1,r); Sol(l,mid,r);}int main(){ int n=0,cnt=0,tot=0; scanf("%d%d",&n,&n); for(;;) { int opt=0; scanf("%d",&opt); if(opt==3) break; if(opt==1) { s[++cnt].opt=1; scanf("%d%d%d",&s[cnt].x,&s[cnt].y,&s[cnt].w); s[cnt].x++,s[cnt].y++; } if(opt==2) { tot++; s[++cnt].opt=2,s[cnt].num=tot; scanf("%d%d",&s[cnt].x,&s[cnt].y),s[cnt].y++; s[++cnt].opt=3,s[cnt].num=tot; scanf("%d%d",&s[cnt].x,&s[cnt].y1),s[cnt].x++,s[cnt].y1++; s[cnt].y=s[cnt-1].y; s[cnt-1].y1=s[cnt].y1; } } CDQ(1,cnt); for(int i=1;i<=tot;i++) printf("%d\n",ans[i]); return 0;}