#include <cstdio>
#include <algorithm>
#define MAXN 100000
using namespace std;
struct groapa{
int x, y;
}g[MAXN+5];
struct interval{
int st, dr, lin;
}v[100000];
bool cmp(groapa a, groapa b){
return a.y<b.y;
}
int caut(int st, int dr, int val){
int m;
if (st>dr)
return -1;
else{
m=(st+dr)/2;
if (val>=v[m].st && val<=v[m].dr)
return m;
if (val<=v[m].st)
return caut(st, m-1, val);
else return caut(m+1, dr, val);
}
}
int main(){
int c, n, i, stanga, nrint, m, q, x1, y1, x2, y2, ans, z1, z2;
freopen("gropi.in", "r", stdin);
freopen("gropi.out", "w", stdout);
scanf("%d%d", &c, &n);
for (i=1; i<=n; i++)
scanf("%d%d", &g[i].x, &g[i].y);
sort(g+1, g+n+1, cmp);
stanga=1;
nrint=0;
g[n+1].x=(g[n].x+1)%3;
g[n+1].y=c+1;
for (i=2; i<=n+1; i++){
if (g[i].x!=g[i-1].x){
nrint++;
v[nrint].st=stanga;
v[nrint].dr=g[i].y-1;
stanga=g[i].y;
v[nrint].lin=g[i-1].x;
}
}
scanf("%d", &m);
for (q=1; q<=m; q++){
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
if (y1>y2){
swap(x1,x2);
swap(y1,y2);
}
ans=y2-y1+1;
z1=caut(1, nrint, y1);
if (v[z1].lin==x1) ans++;
z2=caut(1, nrint, y2);
if (v[z2].lin==x2) ans++;
ans+=z2-z1;
printf("%d\n", ans);
}
return 0;
}