1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #define N 1000010 struct Pos{ int x,y,z,p,id,sum; bool operator<(const Pos&W)const{ if(x!=W.x) return x<W.x; if(y!=W.y) return y<W.y; return z < W.z; } }p[N],tmp[N]; int n,m,idx,ans[N];
void merge(int l,int r){ if(l>=r) return ; int mid=l+r>>1; merge(l,mid); merge(mid+1,r); int i=l,j=mid+1,cnt=0; int sum=0; while(i<=mid&&j<=r){ if(p[i].y<=p[j].y) sum += (!p[i].z), tmp[++cnt]=p[i++]; else p[j].sum += sum, tmp[++cnt] = p[j++]; } while(i<=mid) sum += (!p[i].z), tmp[++cnt]=p[i++]; while(j<=r) p[j].sum += sum, tmp[++cnt] = p[j++]; for(int i=l,j=1;i<=r;) p[i++]=tmp[j++]; }
signed main(){ n=read(),m=read(); rep(i,1,n){ int x=read(),y=read(); p[++idx]={x,y,0,0,0,0}; } for(int i=1;i<=m;++i){ int x1=read(),x2=read(),y1=read(),y2=read(); p[++idx]={x2,y2,1,1,i,0}; p[++idx]={x1-1,y1-1,1,1,i,0}; p[++idx]={x1-1,y2,1,-1,i,0}; p[++idx]={x2,y1-1,1,-1,i,0}; } sort(p+1, p+1+idx); merge(1,idx); for(int i=1;i<=idx;++i){ if(p[i].z) ans[p[i].id] += p[i].p*p[i].sum; } for(int i=1;i<=n;++i) print(ans[i]); return 0; }
|