#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
struct Coord{
    unsigned x, y;
    Coord(){}
    Coord(unsigned a, unsigned b):x(a),y(b){}
};
unsigned const none=1048575;
struct TreeNode{
    TreeNode *l, *r;
    std::map<unsigned, unsigned> ws;
    unsigned halfSize;
    TreeNode(unsigned h):l(NULL),r(NULL),halfSize(h){
        ws[0]=none;
        return;
    }
    void haveL(){
        if(!l) l=new TreeNode(halfSize/2);
        return;
    }
    void haveR(){
        if(!r) r=new TreeNode(halfSize/2);
        return;
    }
    unsigned find(unsigned y){
        return (--ws.upper_bound(y))->second;
    }
    unsigned find(unsigned x, unsigned y){
        unsigned a=none;
        if(x<halfSize){
            if(l) a=l->find(x, y);
        }else{
            if(r) a=r->find(x-halfSize, y);
        }
        return a==none ? find(y) : a;
    }
    unsigned find(Coord c){
        return find(c.x, c.y);
    }
    void addRect(Coord a, Coord b, unsigned i){
        if(halfSize==0 || (a.x==0&&b.x==2*halfSize)){
            unsigned prev=find(a.y);
            ws[a.y]=i;
            ws[b.y]=prev;
        }else{
            if(a.x<halfSize){
                haveL();
                l->addRect(a, Coord(std::min(b.x, halfSize), b.y), i);
            }
            if(b.x>halfSize){
                haveR();
                r->addRect(Coord(std::max(a.x, halfSize)-halfSize, a.y), Coord(b.x-halfSize, b.y), i);
            }
        }
        return;
    }
};
struct Window{
    Coord a, b;
    unsigned parent, depth;
    std::vector<unsigned> children;
    Window(){}
    Window(Coord x, Coord y):a(x),b(y){}
    bool operator<(const Window &that) const{
        return a.x<that.a.x;
    }
};
Window ws[1<<20];
std::vector<unsigned> lcaNodes;
unsigned rmq[21][1<<21];
unsigned lcaFirst[1<<20], lcaLast[1<<20];
void lcaDFS(unsigned me){
    lcaFirst[me]=lcaNodes.size();
    //lcaLast[me]=lcaNodes.size();
    lcaNodes.push_back(me);
    for(unsigned i=0;i<ws[me].children.size();i++){
        lcaDFS(ws[me].children[i]);
        //lcaLast[me]=lcaNodes.size();
        lcaNodes.push_back(me);
    }
    return;
}
void lcaRMQ(){
    for(unsigned i=0;i<lcaNodes.size();i++){
        rmq[0][i]=ws[lcaNodes[i]].depth;
    }
    for(unsigned i=0;i<20;i++){
        for(unsigned j=0;j<lcaNodes.size();j++){
            if(j+(1<<i) < lcaNodes.size()){
                rmq[i+1][j]=std::min(rmq[i][j], rmq[i][j+(1<<i)]);
            }else{
                rmq[i+1][j]=rmq[i][j];
            }
        }
    }
    return;
}
unsigned lca(unsigned a, unsigned b){
    if(a!=none && (a>b||b==none)) std::swap(a, b);
    //std::cout<<"lca "<<a<<' '<<b<<std::endl;
    if(a==b) return ws[a].depth;
    unsigned exp=0;
    unsigned x=lcaFirst[a];
    unsigned y=lcaFirst[b];
    //std::cout<<"lca'"<<x<<' '<<y<<std::endl;
    while((1<<exp)<=y-x){
        exp++;
    }
    exp--;
    //std::cout<<"exp "<<exp<<std::endl;
    unsigned res=std::min(rmq[exp][x], rmq[exp][y-(1<<exp)]);
    //std::cout<<"is "<<res<<std::endl;
    return res;
}
TreeNode tree(1<<19);
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(NULL);
    unsigned N;
    std::cin>>N;
    for(unsigned i=0;i<N;i++){
        std::cin>>ws[i].a.x>>ws[i].a.y>>ws[i].b.x>>ws[i].b.y;
    }
    std::sort(ws, ws+N);

    ws[none].parent=none;
    for(unsigned i=0;i<N;i++){
        ws[i].parent=tree.find(ws[i].a);
        //std::cout<<i<<"->"<<ws[i].parent<<'\n';
        ws[i].depth=ws[ws[i].parent].depth+1;
        ws[ws[i].parent].children.push_back(i);
        tree.addRect(ws[i].a, ws[i].b, i);
    }
    lcaDFS(none);
    lcaRMQ();
    unsigned Q;
    std::cin>>Q;
    for(unsigned i=0;i<Q;i++){
        Coord a, b;
        std::cin>>a.x>>a.y>>b.x>>b.y;
        unsigned wa=tree.find(a), wb=tree.find(b), dsum=ws[wa].depth+ws[wb].depth;
        std::cout<<dsum-2*lca(wa,wb)<<'\n';
    }
    return 0;
}
