#include<bits/stdc++.h>
#define N 500010
#define logN 20
using namespace std;
struct node
{
int l,r,siz,L,R;
}tree[N*logN];
struct Read
{
int x,y;
}a[N];
struct Query
{
int lx,ly,rx,ry;
}q[N];
int n,m,Len,cnt;
int root[N],arr[N*6];
template <typename T>
inline T read(T &x)
{
T flg=1;x=0;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') flg=-flg;ch=getchar();}
while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*=flg;
}
template <typename T>
inline void write(T x)
{
if(x<0) x=-x,putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
}
template <typename T>
inline void writeln(T x) {write(x);puts("");}
template <typename T>
inline void writesp(T x) {write(x);putchar(' ');}
inline int cmp(Read x,Read y) {return x.x^y.x?x.x<y.x:x.y<y.y;}
inline void updata(int i)
{
tree[i].siz=tree[tree[i].l].siz+tree[tree[i].r].siz;
}
inline int build(int l,int r)
{
int k=++cnt;
tree[k].siz=0;
tree[k].L=l;
tree[k].R=r;
if(l<r)
{
int mid=l+r>>1;
tree[k].l=build(l,mid);
tree[k].r=build(mid+1,r);
}
return k;
}
inline int modify(int p,int l,int r,int x)
{
int k=++cnt;
tree[k].siz=tree[p].siz+1;
tree[k].l=tree[p].l;
tree[k].r=tree[p].r;
tree[k].L=l;
tree[k].R=r;
if(l<r)
{
int mid=l+r>>1;
if(x<=mid) tree[k].l=modify(tree[p].l,l,mid,x);
else tree[k].r=modify(tree[p].r,mid+1,r,x);
}
return k;
}
inline void Add(int i,int Node)
{
if(tree[i].L==tree[i].R&&tree[i].L==Node)
{
++tree[i].siz;
return;
}
int mid=tree[i].L+tree[i].R>>1;
if(Node<=mid) Add(tree[i].l,Node);
if(Node>mid) Add(tree[i].r,Node);
updata(i);
}
inline int query(int p,int q,int l,int r)
{
if(tree[q].L>=l&&tree[q].R<=r) return tree[q].siz-tree[p].siz;
int mid=tree[q].L+tree[q].R>>1;
int res=0;
if(l<=mid) res+=query(tree[p].l,tree[q].l,l,r);
if(r>mid) res+=query(tree[p].r,tree[q].r,l,r);
return res;
}
signed main()
{
read(n);read(m);
for(register int i=1;i<=n;++i)
{
arr[++Len]=read(a[i].x);
arr[++Len]=read(a[i].y);
}
for(register int i=1;i<=m;++i)
{
arr[++Len]=read(q[i].lx);
arr[++Len]=read(q[i].ly);
arr[++Len]=read(q[i].rx);
arr[++Len]=read(q[i].ry);
}
sort(arr+1,arr+Len+1);
int len=unique(arr+1,arr+Len+1)-arr-1;
for(register int i=1;i<=n;++i)
{
a[i].x=lower_bound(arr+1,arr+len+1,a[i].x)-arr;
a[i].y=lower_bound(arr+1,arr+len+1,a[i].y)-arr;
}
for(register int i=1;i<=m;++i)
{
q[i].lx=lower_bound(arr+1,arr+len+1,q[i].lx)-arr;
q[i].ly=lower_bound(arr+1,arr+len+1,q[i].ly)-arr;
q[i].rx=lower_bound(arr+1,arr+len+1,q[i].rx)-arr;
q[i].ry=lower_bound(arr+1,arr+len+1,q[i].ry)-arr;
}
int top=1;
root[0]=build(1,len);
sort(a+1,a+n+1,cmp);
for(register int i=1;i<=len;++i)
if(a[top].x==i)
{
root[i]=modify(root[i-1],1,len,a[top++].y);
while(a[top].x==i&&top<=n) Add(root[i],a[top++].y);
}
else root[i]=root[i-1];
for(register int i=1;i<=m;++i)
writeln(query(root[q[i].lx-1],root[q[i].rx],q[i].ly-1,q[i].ry));
return 0;
}
/*
5 2
1 10
6 11
2 2
2 1
7 10
2 2 8 18
0 0 8 18
*/