///STL gone crazy
#include <algorithm>
#include <cstdio>
#include <tuple>
#include <vector>
#define mp make_pair //too bored inline crap
using namespace std;
typedef pair<int, int> poz;
typedef tuple<int, int, int> seq;
vector<poz> ps;
vector<seq> sq;
inline void lasa(int &n, int &m){ //pa svenska, "lasa" (med en 'a' umlaut) betyder "citeste" :)
for(int x,y,i=0; i<n; ++i){
scanf("%d%d",&y,&x);
ps.push_back(mp(x,3-y));
}
sort(ps.begin(), ps.end());
sq.push_back(make_tuple(0,0,0));
for(auto i:ps){
if(sq.empty())
sq.push_back(make_tuple(i.first,i.first,i.second));
else if(i.second==get<2>(sq.back()))
get<1>(sq.back())=i.first;
else
sq.push_back(make_tuple(i.first,i.first,i.second));
}
scanf("%d",&m);
}
inline int dist(poz a, poz b){
if(a.first==b.first)
return a!=b;
int r=b.first-a.first+1;
vector<seq>::iterator ia,ib;
ia=upper_bound(sq.begin(), sq.end(), make_tuple(a.first,0,0))-1;
ib=upper_bound(sq.begin(), sq.end(), make_tuple(b.first,0,0))-1;
if(ia==ib){
if(get<2>(*ia)==a.second && get<2>(*ib)==b.second)
return r;
if(upper_bound(ps.begin(), ps.end(), a)!=lower_bound(ps.begin(), ps.end(), b))
r+=2-(a.second!=b.second);
return r;
}
else{
if(ia==sq.begin())
ia++;
if(ib==sq.begin())
ib++;
r+=ib-ia;
r+=a.second!=get<2>(*ia);
r+=b.second!=get<2>(*ib);
}
return r;
}
int main(void){
freopen("gropi.in","r",stdin);
freopen("gropi.out","w",stdout);
int n,m,c;
poz a,b;
scanf("%d%d",&c,&n);
lasa(n,m);
for(int i=0; i<m; ++i){
scanf("%d%d%d%d",&a.second,&a.first,&b.second,&b.first);
if(a>b)
swap(a,b);
printf("%d\n",dist(a,b));
}
return 0;
}