#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,long long>P;
long long w,h,m;
long long dotti=0;
vector<long long> xv,yv;
int masu[1001][1001]={0};
long long X1[110],X2[110],Y1[110],Y2[110];
long long dx[4]={0,1,0,-1};
long long dy[4]={1,0,-1,0};
long long check[5001][5001]={0};
vector<long long> node[105005];
long long compress(long long *x1,long long *x2,long long w);
main(){
  cin>>w>>h>>m;
  w*=2;
  h*=2;
  for(int i=0;i<m;i++){
    cin>>X1[i]>>Y1[i]>>X2[i]>>Y2[i];
    X1[i]*=2;
    X2[i]*=2;
    if(X1[i]>X2[i]) swap(X1[i],X2[i]);
    Y1[i]*=2;
    Y2[i]*=2;
    if(Y1[i]>Y2[i]) swap(Y1[i],Y2[i]);
  }
  X1[m]=0;X2[m]=w;Y1[m]=0;Y2[m]=0;m++;
  X1[m]=0;X2[m]=w;Y1[m]=h;Y2[m]=h;m++;
  X1[m]=0;X2[m]=0;Y1[m]=0;Y2[m]=h;m++;
  X1[m]=w;X2[m]=w;Y1[m]=0;Y2[m]=h;m++;
  w=compress(X1,X2,w);
  dotti=1;
  h=compress(Y1,Y2,h);
  for(int i=0;i<m;i++){
    for(long long y=Y1[i];y<=Y2[i]&&y<h;y++){
      for(long long x=X1[i];x<=X2[i]&&x<w;x++){
	masu[y][x]=-1;
      }
    }
  }
  long long now=0;
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      if(masu[i][j]==0){
	queue<P> que;
	now++;
	que.push(P(i,j));
	while(!que.empty()){
	  int nowy=que.front().first;
	  int nowx=que.front().second;
	  que.pop();
	  masu[nowy][nowx]=now;
	  for(int k=0;k<4;k++){
	    long long nx=nowx+dx[k];
	    long long ny=nowy+dy[k];
	    if(ny>=0&&ny<h&&nx>=0&&nx<w&&masu[ny][nx]==0){
	      masu[ny][nx]=now;
	      que.push(P(ny,nx));
	    }
	  }
	}
      }
    }
  }
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      long long me=masu[i][j];
      for(int k=0;k<4;k++){
	long long ny=i+dy[k]*2;
	long long nx=j+dx[k]*2;
	if(ny>=0&&ny<h&&nx>=0&&nx<w){
	  long long to=masu[ny][nx];
	  if(me!=-1&&to!=-1&&me!=to&&check[me][to]==0){
	    node[me].push_back(to);
	    node[to].push_back(me);
	    check[me][to]=1;
	    check[to][me]=1;
	  }
	}
      }
    }
  }
  long long e;
  long long mincost[105005];
  long long sx,sy,gx,gy;
  cin>>e;
  if(m==0){
    for(int i=0;i<e;i++){
      cin>>sx>>sy>>gx>>gy;
      cout<<0<<endl;
    }
  }
  else{
    for(int i=0;i<e;i++){
      long long s,g;
      cin>>sx>>sy>>gx>>gy;
      sx*=2;
      sy*=2;
      gx*=2;
      gy*=2;
      long long sxp,syp,gxp,gyp;
      sxp=upper_bound(xv.begin(),xv.end(),sx)-xv.begin()-1;
      syp=upper_bound(yv.begin(),yv.end(),sy)-yv.begin()-1;
      gxp=upper_bound(xv.begin(),xv.end(),gx)-xv.begin()-1;
      gyp=upper_bound(yv.begin(),yv.end(),gy)-yv.begin()-1;
      sxp=max(sxp,0LL);
      syp=max(syp,0LL);
      gxp=max(gxp,0LL);
      gyp=max(gyp,0LL);
      if(sxp>=0&&syp>=0&&gxp>=0&&gyp>=0&&sxp<w&&gxp<w&&syp<h&&gyp<h){
	s=masu[syp][sxp];
	g=masu[gyp][gxp];
	if(s==-1||g==-1) break;
	for(int j=1;j<=now;j++){
	  mincost[j]=(1LL<<60);
	}
	priority_queue<P,vector<P>,greater<P> >que;
	que.push(P(0,s));
	while(!que.empty()){
	  long long nowc=que.top().first;
	  long long nowp=que.top().second;
	  que.pop();
	  if(nowp==g){
	    cout<<nowc<<endl;
	    break;
	  }
	  for(int j=0;j<node[nowp].size();j++){
	    long long nextp=node[nowp][j];
	    if(mincost[nextp]>nowc+1){
	      mincost[nextp]=nowc+1;
	      que.push(P(nowc+1,nextp));
	    }
	  }
	}
      }
      else{
	cout<<sxp<<" "<<syp<<" "<<gxp<<" "<<gyp<<endl;
      }
    }
  }
}
long long compress(long long *x1,long long *x2,long long W){
  vector<long long> xs;
  for(int i=0;i<m;i++){
    for(long long d=-1;d<=1;d++){
      long long tx1=x1[i]+d,tx2=x2[i]+d;
      if(0<=tx1&&tx1<W) xs.push_back(tx1);
      if(0<=tx2&&tx2<W) xs.push_back(tx2);
    }
  }
  sort(xs.begin(),xs.end());
  xs.erase(unique(xs.begin(),xs.end()),xs.end());
  for(int i=0;i<m;i++){
    x1[i]=find(xs.begin(),xs.end(),x1[i])-xs.begin();
    x2[i]=find(xs.begin(),xs.end(),x2[i])-xs.begin();
  }
  if(dotti==0) xv=xs;
  else yv=xs;
  return xs.size();
}

Measured memory_bytes: 8644