/**************************************************************
Problem: 1935
User: syh0313
Language: C++
Result: Accepted
Time:4232 ms
Memory:274732 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=10000010;
int n,m,cnt,ans[maxn],a[maxn],t;
struct da{ int op,x,y,v,id;}q[maxn];
bool cmp(da aa,da bb)
{
if (aa.x==bb.x && aa.y==bb.y) return aa.op<bb.op;
if (aa.x==bb.x) return aa.y<bb.y;
return aa.x<bb.x;
}
inline int lowbit( int x){ return x&(-x);}
void add( int x, int k){ while (x<=t) {a[x]+=k; x+=lowbit(x);}}
int qury( int x){ int sum=0; while (x) {sum+=a[x]; x-=lowbit(x);} return sum;}
int read()
{
int xx=0,ff=1; char c= getchar ();
while (c< '0' || c> '9' ) { if (c== '-' ) ff=-1; c= getchar ();}
while (c>= '0' && c<= '9' ) {xx=(xx<<1)+(xx<<3)+c- '0' ; c= getchar ();}
return xx*ff;
}
int main()
{
scanf ( "%d%d" ,&n,&m);
for ( int i=1;i<=n;i++)
{ int x,y; x=read(); y=read(); x+=2; y+=2; q[++cnt]={0,x,y,0,0}; t=max(t,y);}
for ( int i=1;i<=m;i++)
{
int x,y,xx,yy; x=read(); y=read(); xx=read(); yy=read(); x+=2; y+=2; xx+=2; yy+=2;
q[++cnt]={1,x-1,y-1,1,i}; q[++cnt]={1,xx,yy,1,i};
q[++cnt]={1,x-1,yy,-1,i}; q[++cnt]={1,xx,y-1,-1,i};
t=max(t,y); t=max(t,yy);
}
sort(q+1,q+cnt+1,cmp);
for ( int i=1;i<=cnt;i++)
{
if (!q[i].op) add(q[i].y,1);
else ans[q[i].id]+=qury(q[i].y)*q[i].v;
}
for ( int i=1;i<=m;i++) printf ( "%d\n" ,ans[i]);
return 0;
}
|