#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
ifstream in("zoo.in");
ofstream out("zoo.out");
const int MAX = 32000;
struct punct {
int x, y;
};
inline bool cmpx(punct a, punct b) {
return a.x < b.x;
}
vector<int> a[100000];
punct x[16010];
int i,j,n,m,qix,qiy,qsx,qsy,up[16010];
void build(int i, int li, int ls) {
if(li > ls)
return;
if(li == ls) {
a[i].push_back(x[li].y);
return;
}
build(2*i, li, (li+ls)/2);
build(2*i+1, (li+ls)/2+1, ls);
vector<int>::iterator it1 = a[2*i].begin(), it2 = a[2*i+1].begin(), end1 = a[2*i].end(), end2 = a[2*i+1].end();
while(it1 != end1 && it2 != end2) {
if(*it1 < *it2) {
a[i].push_back(*it1);
++ it1;
} else {
a[i].push_back(*it2);
++ it2;
}
}
while(it1 != end1)
a[i].push_back(*it1), ++it1;
while(it2 != end2)
a[i].push_back(*it2), ++it2;
}
int query(int i, int li, int ls, int lix, int liy, int lsx, int lsy) {
if(x[ls].x < lix || x[li].x > lsx)
return 0;
if(lix <= x[li].x && lsx >= x[ls].x) {
vector<int>::iterator start = lower_bound(a[i].begin(), a[i].end(), liy);
vector<int>::iterator end = upper_bound(a[i].begin(), a[i].end(), lsy);
return end-start;
}
return query(2*i, li, (li+ls)/2, lix, liy, lsx, lsy) + query(2*i+1, (li+ls)/2+1, ls, lix, liy, lsx, lsy);
}
int main() {
in>>n;
for(i=1; i<=n; i++) {
in>>x[i].x>>x[i].y;
}
sort(x+1, x+n+1, cmpx);
build(1, 1, n);
in>>m;
for(i=1; i<=m; i++) {
in>>qix>>qiy>>qsx>>qsy;
out<<query(1, 1, n, qix, qiy, qsx, qsy)<<endl;
}
return 0;
}