/*
更新には対応していない
非再帰

参考
蟻本p170
verify:
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_C&lang=jp
*/
#include <bits/stdc++.h>
using namespace std;

template<class T>
struct RangeTree{
    int size;
    vector<vector<T>> seg;
    RangeTree(int N){
        size=1;
        while(size<N) size<<=1;
        seg.assign(2*size,vector<T>());
    }
    void set(int k,T x){
        seg[k+size].push_back(x);
    }
    void build(){
        for(int k=2*size-1;k>=size;k--){
            sort(seg[k].begin(),seg[k].end());
        }
        for(int k=size-1;k>0;k--){
            int x=seg[2*k].size()+seg[2*k+1].size();
            merge(seg[2*k].begin(),seg[2*k].end(),seg[2*k+1].begin(),seg[2*k+1].end(),back_inserter(seg[k]));
        }
    }
    //seg[k]のx以上y以下をpush
    inline void push(int k,T &x,T &y,vector<T> &ret){
        int itr1=lower_bound(seg[k].begin(),seg[k].end(),x)-seg[k].begin();
        int itr2=upper_bound(seg[k].begin(),seg[k].end(),y)-seg[k].begin();
        copy(seg[k].begin()+itr1,seg[k].begin()+itr2,back_inserter(ret));
    }

    //[a:b)のx以上y以下を全列挙
    vector<T> query(int a,int b,T x,T y){
        vector<T> ret;
        for(a+=size,b+=size;a<b;a>>=1,b>>=1){
            if(a&1) push(a,x,y,ret),a++;
            if(b&1) push(b-1,x,y,ret),b--;
        }
        return ret;
    }
};

template<class T>
struct Compress{
    vector<T> cv; //順番にして重複を消したもの
    bool flag;
    Compress():flag(false){};

    Compress(const vector<T> &v):flag(false){
        add(v);
    }
    //vectorを追加
    void add(const vector<T> &v){
        flag=false;
        copy(v.begin(),v.end(),back_inserter(cv));
    }
    //Tを追加
    void add(const T x){
        flag=false;
        cv.emplace_back(x);
    }
    //テーブルを作る O(NlogN)
    void build(){
        flag=true;
        sort(cv.begin(),cv.end());
        cv.erase(unique(cv.begin(),cv.end()),cv.end());
    }
    //vectorの要素を座標圧縮したものを返す O(NlogN)
    vector<int> get(const vector<T> &v) const{
        assert(flag);
        vector<int> ret(v.size());
        for(int i=0;i<v.size();i++) ret[i]=lower_bound(cv.begin(),cv.end(),v[i])-cv.begin();
        return ret;
    }
    //xを座標圧縮したものを返す O(logN)
    int get(const T x)const{
        return lower_bound(cv.begin(),cv.end(),x)-cv.begin();
    }
    //座標圧縮後のkが示す実際の値 O(1)
    T &operator[](int k){
        return cv[k];
    }
};
const int MAX=1<<30;

signed main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    /*vector<int> a={1,3};
    vector<int> b={2};
    vector<int> c;
    merge(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
    for(int i=0;i<c.size();i++) cout<<c[i]<<endl;*/
    using pii=pair<int,int>;
    int N;
    cin>>N;
    vector<int> x(N),y(N);
    for(int i=0;i<N;i++) cin>>x[i]>>y[i];
    
    int Q;
    cin>>Q;
    vector<int> sx(Q),tx(Q),sy(Q),ty(Q);
    for(int i=0;i<Q;i++){
        cin>>sx[i]>>tx[i]>>sy[i]>>ty[i];
    }
    Compress<int> X;
    X.add(x);X.add(sx);X.add(tx);
    X.build();
    auto xx=X.get(x);
    RangeTree<pii> seg(X.cv.size());
    for(int i=0;i<N;i++){
        seg.set(xx[i],pii(y[i],i));
    }
    seg.build();
    /*for(int i=0;i<16;i++){
        cout<<"++++++++"<<i<<"+++++++++++++"<<endl;
        for(auto x:seg.seg[i]){
            cout<<x.first<<" "<<x.second<<endl;
        }
    }*/
    
    auto ssx=X.get(sx);
    auto ttx=X.get(tx);
    for(int i=0;i<Q;i++){
        auto ret=seg.query(ssx[i],ttx[i]+1,pii(sy[i],0),pii(ty[i],MAX));
        vector<int> ans;
        for(int i=0;i<ret.size();i++){
            ans.push_back(ret[i].second);
        }
        sort(ans.begin(),ans.end());
        for(int i=0;i<ret.size();i++) cout<<ans[i]<<"\n";
        cout<<"\n";
    }

}


Measured memory_bytes: 120388