#include<set> #include<cstdio> #define N 100005 #define sit set<Data>::iterator usingnamespace std; structData { int x,y,id; booloperator<(const Data a) const { if (x<a.x) return1; if (x>a.x) return0; return (y<a.y) ; } }; sit px[N],py[N]; set<Data> a,b; int n,m; intmain() { scanf("%d%d",&n,&m); for (int i=1,x,y;i<=n;++i) { scanf("%d%d",&x,&y); Data c=Data{x,y,i}; Data d=Data{y,x,i}; a.insert(c),px[i]=a.find(c); b.insert(d),py[i]=b.find(d); } for (int ux,uy,vx,vy,ans;m--;) { scanf("%d%d%d%d",&ux,&uy,&vx,&vy);ans=0; if (!a.empty()) { sit i=a.lower_bound(Data{ux,uy,0}),c; while (i!=a.end() && (*i).x==ux && (*i).y<=vy) c=i++,++ans,b.erase(py[(*c).id]),a.erase(c); } if (!a.empty()) { sit j=a.lower_bound(Data{vx,uy,0}),c; while (j!=a.end() && (*j).x==vx && (*j).y<=vy) c=j++,++ans,b.erase(py[(*c).id]),a.erase(c); } if (!b.empty()) { sit i=b.lower_bound(Data{uy,ux,0}),c; while (i!=b.end() && (*i).x==uy && (*i).y<=vx) c=i++,++ans,a.erase(px[(*c).id]),b.erase(c); } if (!b.empty()) { sit j=b.lower_bound(Data{vy,ux,0}),c; while (j!=b.end() && (*j).x==vy && (*j).y<=vx) c=j++,++ans,a.erase(px[(*c).id]),b.erase(c); } printf("%d\n",ans); } }