#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#include <map>

using namespace std;

struct point{
    int x, y;
    point(){};
    point ( int x, int y ){
        this -> x = x;
        this -> y = y;
    }
};

struct rec{
    point a, b;
};

int N, Q;
int it[1 << 22];
rec R[1 << 17];
rec query[1 << 17];
vector < point > P;
map < pair < int, int >, int > mp;
vector < int > add[1 << 20];
vector < int > del[1 << 20];
vector < point > pts[1 << 20];
set < pair < int, int > > st;
int who[1 << 17];
vector < int > v[1 << 17];
int used[1 << 17];

void scan(){
    scanf ( "%d", &N );
    
    for ( int i = 0; i < N; ++i ){
        scanf ( "%d%d%d%d", &R[i].a.x, &R[i].a.y, &R[i].b.x, &R[i].b.y );
        R[i].a.x += 2; R[i].a.y += 2; R[i].b.x += 2; R[i].b.y += 2;
        P.push_back ( R[i].a );
    }
    
    
    scanf ( "%d", &Q );
    
    for ( int i = 0; i < Q; ++i ){
        scanf ( "%d%d%d%d", &query[i].a.x, &query[i].a.y, &query[i].b.x, &query[i].b.y );
        query[i].a.x += 2; query[i].a.y += 2; query[i].b.x += 2; query[i].b.y += 2;
        P.push_back ( query[i].a );
        P.push_back ( query[i].b );
    }
}

int f ( point t1, point t2 ){
    if ( t1.x == t2.x )
        return t1.y < t2.y;
    
    return t1.x < t2.x;
}

int check ( int x ){
    set < pair < int, int > > :: iterator it;
    pair < int, int > t = make_pair ( x, 1e9 );
    
    it = st.lower_bound ( t );
    
    if ( it == st.end() ){
        if ( it == st.begin() ) return -1;
        else --it;
    }
    if ( it -> first > t.first )
    --it;
    if ( R[it -> second].b.y < t.first )
        return -1;
    return it->second;
}

void addSeg ( int idx ){
    st.insert ( make_pair ( R[idx].a.y, idx ) );
}
void delSeg ( int idx ){
    st.erase ( make_pair ( R[idx].a.y, idx ) );
}

bool g ( rec t1, rec t2 ){
    return t1.b.x - t1.a.x > t2.b.x - t2.a.x;
}

inline int inRec ( rec t1, point t2 ){
    return t1.a.x <= t2.x && t1.b.x >= t2.x && t1.a.y <= t2.y && t1.b.y >= t2.y;
}
int ff ( int i, point p ){
    used[i] = 1;
    for ( int j = 0; j < v[i].size(); ++j )
        if ( inRec ( R[ who[v[i][j]] ], p ) && !used[ v[i][j] ] ){
            int t = ff ( v[i][j], p );
            used[i] = 0;
            return t;
        }
    used[i] = 0;
    
    return i;
}

int rem, T2;
void dfs ( int i, int d ){
    used[i] = 1;
    if ( T2 == i )
        rem = d;
    for ( int j = 0; j < v[i].size(); ++j )
        if ( !used[ v[i][j] ] )
            dfs ( v[i][j], d + 1 );
    used[i] = 0;
}
int dist ( int t1, int t2 ){
    T2 = t2;
    dfs ( t1,  0 );
    return rem;
}
void solve(){
    R[N].a.x = R[N].a.y = 0;
    R[N].b.x = R[N].b.y = 1e6 + 1;
    ++N;
    sort ( P.begin(), P.end(), f );
    sort ( R, R + N, g );
    
    for ( int i = 0; i < N; ++i ){
        add[ R[i].a.x ].push_back ( i );
        del[ R[i].b.x ].push_back ( i );
    }
    for ( int i = 0; i < (int)P.size(); ++i )
        pts[ P[i].x ].push_back ( P[i] );
    
    who[1] = 0;
    int cnt = 2;
    for ( int i = 1; i < N; ++i ){
        int t = ff ( 1, R[i].a );
        who[cnt] = i;
        v[t].push_back ( cnt );
        v[cnt].push_back ( t );
   //     cout << t << " " << cnt << " " << R[ who[t] ].a.x << " " <<  R[ who[t] ].a.y << " " <<  R[i].a.x << " " << R[i].a.y << endl;
        ++cnt;
    }
    
    for ( int i = 0; i < Q; ++i ){
        int t1 = ff ( 1, query[i].a ), t2 = ff ( 1, query[i].b );
       // cout << t1 << " " << t2 << endl;
     //   cout << query[i].a.x << " " << query[i].a.y << endl;
        printf ( "%d\n", dist ( t1, t2 ) );
    }

    /*
    for ( int i = 0; i < ( 1 << 20 ); ++i ){
        for ( int j = 0; j < (int)pts[i].size(); ++j )
            mp[ make_pair ( pts[i][j].x, pts[i][j].y ) ] = check ( pts[i][j].y );
            
        for ( int j = 0; j < (int)add[i].size(); ++j ){
            addSeg ( add[i][j] );
            cout << i << " " << add[i][j] << "\n";
        }
        for ( int j = 0; j < (int)del[i].size(); ++j ){
            delSeg ( del[i][j] );
            cout << i << "-" << del[i][j] << "\n";
        }
    }
    
    for ( map < pair < int, int >, int > :: iterator i = mp.begin(); i != mp.end(); ++i )
        cout << ( i -> first.first ) << " " << ( i -> first.second ) << " " << ( i -> second ) << endl;
        */
}

int main(){
    scan();
    solve();
}