#include <iostream>
#include <cstdlib>
#include <fstream>
#define MAXC 1000000
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
using namespace std;
ifstream in ("gropi.in");
ofstream out("gropi.out");
int N,M,C;
long long v1[MAXC],v2[MAXC];//C - coloane , N - nr gropi , M - nr cerinte
int i,linie,col,linie1,col1,dif,diagonala;
void cit(){
in>>C>>N;
for( i = 0 ; i < N; i ++){
in>>linie>>col;
if(linie == 1){
v1[col] = 1;
}else if(linie == 2){
v2[col] = 1;
}
}
in>>M;
}
bool groapa(long long int v[],int y, int y1){
int lo = MIN(y,y1),hi = MAX(y,y1);
for(lo; lo <= hi ; lo++){
if(v[lo] && lo != hi){
return false;
}
}
return true;
}
int lungime1(int x , int y , int x1, int y1){
if(x == 1){
dif = abs(y-y1)+1;
if(groapa(v1,y,y1)){
return dif;
}
return dif + 2;
}
if(x == 2){
dif = abs(y-y1)+1;
if(groapa(v2,y,y1)){
return dif;
}
return dif + 2;
}
}
int lungime2(int x, int y, int x1, int y1){
if(y == y1){
return 2;
}
diagonala = x + (x1 - x);
//cout<<diagonala<<endl;
if(y < y1){
return lungime1(x,y,diagonala,y1-1)+2;
}else if(y > y1){
//cout<<x1<<" "<<y1<<" " <<diagonala<<" "<<y-1<<" ";
return lungime1(x1,y1,diagonala,y-1)+2;
}
}
int RandomFloat(int a, int b)
{
int Number = std::rand() % (b + 1 - a) + a;
return Number;
}
void evaluator(){
for(i = 1; i < 20 ; i ++){
linie = RandomFloat(1,2);
linie1 = RandomFloat(1,2);
col = RandomFloat(1,C);
col1 = RandomFloat(1,C);
out<<linie<<" "<<col<<" "<<linie1<<" "<<col1<<endl;
if(linie == linie1){
out<<lungime1(linie,col,linie1,col1)<<"\n";
}else if(linie != linie1){
out<<lungime2(2,col,2,col1)<<"\n";
}
}
}
void verif(){
for(i = 0; i < M; i ++){
in>>linie>>col>>linie1>>col1;
if(linie == linie1){
out<<lungime1(linie,col,linie1,col1)<<"\n";
}else if(linie != linie1){
out<<lungime2(linie,col,linie1,col1)<<"\n";
}
}
}
int main()
{
cit();
verif();
//evaluator();
return 0;
}