#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;
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(x == 1 && x1 == 2){
dif = MIN(lungime1(x+1,y,x1,y1),lungime1(x,y,x1-1,y1));
if(dif < lungime1(x,y,x1-1,y1)){
dif += 2;
return dif;
}
return ++dif ;
}else if(x == 2 && x1 == 1){
dif = MIN(lungime1(x-1,y,x1,y1),lungime1(x,y,x1+1,y1));
if(dif < lungime1(x,y,x1+1,y1)){
dif += 2;
return dif;
}
return ++dif;
}
}
int RandomFloat(int a, int b)
{
int Number = std::rand() % (b + 1 - a) + a;
return Number;
}
void evaluator(){
for(linie = 1 ; linie <= 2; linie++){
for(col = 1; col <= M ; col ++ ){
linie1 = RandomFloat(1,2);
col1 = RandomFloat(1,M);
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;
}