#include<cstdio>
#include<set>
#include<queue>
#include<algorithm>
#define MAXN 100010
//I HATE NOT HAVING GOOGLE AND DECIPHERING STL
using namespace std;
struct win
{
    int ax,ay,bx,by,id;
};
struct setnode
{
    int line,id;
  /*  bool operator < (setnode b) const
    {
        if(line<b.line) return 1;
        return 0;
    }*/
};
struct qnode
{
    int lend,id;

};
struct qcmp
{
    bool operator()(const qnode s1, const qnode s2) const
    {
        return s1.lend>s2.lend;
    }
};
struct ltset
{
    bool operator()(const setnode s1, const setnode s2) const
    {
        return s1.line<s2.line;
    }

};
struct cpoint
{
    int x,y,id,t;
};

bool f(cpoint u,cpoint v)
{
    if(u.y<v.y) return 1;
    return 0;
}
bool ff(win u,win v)
{
    if(u.ay<v.ay) return 1;
    return 0;
}
int pwin[2][MAXN];
cpoint sp[MAXN*2];
int spcnt,n,q;
win data[MAXN];
vector<int> spis[MAXN];
int parent[MAXN];
win sorted[MAXN];
int setthesets()
{
    set <setnode,ltset> s;
    priority_queue <qnode,  vector<qnode> , qcmp > qe;

    sort(sp,sp+spcnt,f);
    for(int i=0;i<=n;i++)
    {
        sorted[i]=data[i];
        sorted[i].id=i;
    }
    sort(sorted,sorted+n+1,ff);
    qnode qtmp;
    setnode stmp;
    qtmp.lend=sorted[0].by;
    qtmp.id=sorted[0].id;
    qe.push(qtmp);
    stmp.line=sorted[0].ax;
    stmp.id=sorted[0].id;
    s.insert(stmp);
    stmp.line=1000100;
    stmp.id=0;
    s.insert(stmp);

    int points=0;
    set <setnode> :: iterator it;
    for(int i=1;i<=n;i++)
    {
        while(sp[points].y<sorted[i].ay&&points<spcnt)
        {
            stmp.id=-1;
            stmp.line=sp[points].x;
            it=s.upper_bound(stmp);

          //  printf("for point %d %d %d %d\n",sp[points].t,sp[points].id,it->id,it->line);

            if(it->line>sp[points].x) it--;
            int dd=it->id;
          //  printf("for point %d %d %d\n",sp[points].t,sp[points].id,dd);

            while (data[dd].bx<sp[points].x) dd=parent[dd];

                    pwin[sp[points].t][sp[points].id]=dd;
               /* else
                    pwin[sp[points].t][sp[points].id]=parent[it->id];*/
            points++;
        }
        while((!qe.empty())&&(qe.top()).lend<sorted[i].ay)
        {
            qtmp=qe.top();
            stmp.id=qtmp.id;
            stmp.line=data[qtmp.id].ax;
            s.erase(stmp);
            qe.pop();
        }
        stmp.line=sorted[i].ax;
        stmp.id=sorted[i].id;
        s.insert(stmp);
        it=s.find(stmp);
        it--;
        int dd=it->id;
        //hack maybe more sets
        while(data[dd].bx<sorted[i].bx) dd=parent[dd];
            parent[sorted[i].id]=dd;
            spis[dd].push_back(sorted[i].id);
        /*}else
        {
            parent[sorted[i].id]=parent[it->id];
            spis[parent[it->id]].push_back(sorted[i].id);
        }*/
        qtmp.id=sorted[i].id;
        qtmp.lend=sorted[i].by;
        qe.push(qtmp);
    }
    while(points<spcnt)
    {
        while((!qe.empty())&&(qe.top()).lend<sp[points].y)
        {
            qtmp=qe.top();
            stmp.id=qtmp.id;
            stmp.line=data[qtmp.id].ax;
            s.erase(stmp);
            qe.pop();
        }
        stmp.id=-1;
        stmp.line=sp[points].x;
        it=s.upper_bound(stmp);
        if(it->line>sp[points].x) it--;
            int dd=it->id;
            while (data[dd].bx<sp[points].x) dd=parent[dd];

                    pwin[sp[points].t][sp[points].id]=dd;
               /* else
                    pwin[sp[points].t][sp[points].id]=parent[it->id];*/
            points++;
    }

}
//should be rmq
int DFS(int par,int v,int l,int t)
{
    if(v==t) return l;
    if(v!=0)
    if(parent[v]!=par)
    {
        int k=DFS(v,parent[v],l+1,t);
        if(k!=-1) return k;
    }
    for(int i=0;i<spis[v].size();i++)
        if(spis[v][i]!=par)
    {
        int k=DFS(v,spis[v][i],l+1,t);
        if(k!=-1) return k;
    }
    return -1;
}
int main()
{
    scanf("%d",&n);
    data[0].ax=-1;
    data[0].ay=-1;
    data[0].bx=1000001;
    data[0].by=1000001;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&data[i].ax,&data[i].ay,&data[i].bx,&data[i].by);
    }
    scanf("%d",&q);
    for(int i=0;i<q;i++)
    {
        scanf("%d%d%d%d",&sp[spcnt].x,&sp[spcnt].y,&sp[spcnt+1].x,&sp[spcnt+1].y);
        sp[spcnt].id=i;
        sp[spcnt].t=0;
        ++spcnt;
        sp[spcnt].id=i;
        sp[spcnt].t=1;
        ++spcnt;
    }
    setthesets();
   /* for(int i=0;i<=n;i++)
    {
        printf("%d parent %d\n",i,parent[i]);
    }*/
   // printf("%d\n",q);
    for(int i=0;i<q;i++)
    {
        printf("%d\n",DFS(-1,pwin[0][i],0,pwin[1][i]));
        //printf("%d %d %d\n",pwin[0][i],pwin[1][i],DFS(-1,pwin[0][i],0,pwin[1][i]));
    }

}
