#include <cstdio>
#include <algorithm>
#define buffSize 131072
#define vSize 16001
#define TWidth 16001
#define THeight 19
using namespace std;
char buff[buffSize];
bool ok=true;
int ind,cnt,logN;
struct point
{
int x,y;
}v[vSize];
int T[THeight][TWidth];
inline void read(int &val)
{
if(ok)
{
ok=false;
fread(buff,1,buffSize,stdin);
ind=0;
}
int neg=1;
if(buff[ind]=='-')
{
neg=-1;
if(++ind==buffSize)
{
fread(buff,1,buffSize,stdin);
ind=0;
}
}
for(val=0;'0'<=buff[ind]&&buff[ind]<='9';)
{
val*=10;
val+=buff[ind]-'0';
if(++ind==buffSize)
{
fread(buff,1,buffSize,stdin);
ind=0;
}
}
for(;(buff[ind]<'0'||'9'<buff[ind])&&buff[ind]!='-';)
if(++ind==buffSize)
{
fread(buff,1,buffSize,stdin);
ind=0;
}
val*=neg;
}
inline bool cmp(const point &a,const point &b)
{
if(a.x!=b.x) return a.x<b.x;
else return a.y<b.y;
}
inline void update(int level,int L,int R)
{
if(level>logN) return;
for(int i=L;i<=R;++i) T[level][i]=v[i].y;
sort(T[level]+L,T[level]+R+1);
int M=(L+R)>>1;
update(level+1,L,M);
update(level+1,M+1,R);
}
inline int BS(int x,int level,int L,int R)
{
if(L<R)
{
int M=(L+R)>>1;
if(x<=T[level][M]) return BS(x,level,L,M);
else return BS(x,level,M+1,R);
}
else return L;
}
inline void query(int level,int L,int R,int a,int b,int y1,int y2)
{
if(level>logN) return;
if(a<=v[L].x&&v[R].x<=b)
{
int pos1=BS(y1,level,L,R);
int pos2=BS(y2,level,L,R);
cnt+=pos2-pos1+1;
return;
}
int M=(L+R)>>1;
if(a<=v[M].x) query(level+1,L,M,a,b,y1,y2);
if(v[M].x<b) query(level+1,M+1,R,a,b,y1,y2);
}
int main()
{
int M,N,x1,x2,y1,y2;
freopen("zoo.in","r",stdin);
read(N);
for(int i=1;i<=N;++i)
{
read(v[i].x);
read(v[i].y);
}
sort(v+1,v+N,cmp);
for(logN=0;(1<<logN)<N;++logN);
update(1,1,N);
freopen("zoo.out","w",stdout);
read(M);
for(;M--;)
{
read(x1);
read(y1);
read(x2);
read(y2);
cnt=0;
query(1,1,N,x1,x2,y1,y2);
printf("%d\n",cnt);
}
return 0;
}