#include<cstdio>
#include<vector>
#include<algorithm>
#define pb push_back
#define point pair<int, int>
#define x first
#define y second
#define ls (unsigned int)(node << 1)
#define rs (unsigned int)((node << 1) + 1)
#define FOR(i,a,b)\
for(int i=a; i<=b; ++i)
#define infile "zoo.in"
#define outfile "zoo.out"
#define nMax 16005
using namespace std;
struct rectangle{
int x1, y1, x2, y2;
} Rect;
point P[nMax];
int X[nMax];
vector < int > AI[nMax << 2];
int N, M;
void mergeLists(int node){
unsigned int l = 0, r = 0;
while(l < AI[ls].size() && r < AI[rs].size())
if(AI[ls][l] < AI[rs][r])
AI[node].pb(AI[ls][l++]);
else
AI[node].pb(AI[rs][r++]);
while(l < AI[ls].size())
AI[node].pb(AI[ls][l++]);
while(r < AI[rs].size())
AI[node].pb(AI[rs][r++]);
}
void buildTree(int node, int left, int right){
if(left == right){
AI[node].pb(P[left].y);
return;
}
int middle = (left + right) >> 1;
buildTree(ls, left, middle);
buildTree(rs, middle + 1, right);
mergeLists(node);
}
int query(int node, int left, int right){
if(Rect.x1 <= left && right <= Rect.x2)
return max(upper_bound(AI[node].begin(), AI[node].end(), Rect.y2) - lower_bound(AI[node].begin(), AI[node].end(), Rect.y1), 0);
int res = 0, middle = (left + right) >> 1;
if(Rect.x1 <= middle)
res += query(ls, left, middle);
if(Rect.x2 > middle)
res += query(rs, middle + 1, right);
return res;
}
void process(){
sort(X + 1, X + N + 1);
FOR(i,1,N)
P[i].x = lower_bound(X + 1, X + N + 1, P[i].x) - X;
buildTree(1,1,N);
}
int main(){
freopen(infile, "r", stdin);
freopen(outfile, "w", stdout);
scanf("%d", &N);
FOR(i,1,N){
scanf("%d %d", &P[i].x, &P[i].y);
X[i] = P[i].x;
}
process();
for(scanf("%d", &M); M; M--){
scanf("%d %d %d %d", &Rect.x1, &Rect.y1, &Rect.x2, &Rect.y2);
Rect.x1 = lower_bound(X + 1, X + N + 1, Rect.x1) - X;
Rect.x2 = lower_bound(X + 1, X + N + 1, Rect.x2) - X;
printf("%d\n", query(1,1,N));
}
fclose(stdin);
fclose(stdout);
return 0;
}