#include<iostream>
using namespace std;
#include<cstdio>
#include<algorithm>

struct point{ int x, y, id; };

point init(int pos_x, int pos_y, int index)
{
    point p; 
    p.x = pos_x, p.y = pos_y, p.id = index; 
    return p; 
}

bool cmp_x(const point &P1, const point &P2){ if(P1.x != P2.x){ return P1.x < P2.x; } return P1.y < P2.y; }
bool cmp_y(const point &P1, const point &P2){ if(P1.y != P2.y){ return P1.y < P2.y; } return P1.x < P2.x; }

void cycle_x(point *S, point *T, point *U, int left, int right)
{
    int mid = ((left + right) >> 1);
    int a = left, b = mid + 1;

    for(int i = left; i < right; i++){
        if(cmp_x(T[i], S[mid])){
            U[a++] = T[i];
        }else if(S[mid].id == T[i].id){
            U[mid] = T[i];
        }else{
            U[b++] = T[i];
        }
    }
    T[mid] = U[mid];
    if(right - left < 5){
		for(int i = left; i < right; i++){ T[i] = U[i]; }
	}
}

void cycle_y(point *S, point *T, point *U, int left, int right)
{
    int mid = ((left + right) >> 1);
    int a = left, b = mid + 1;

    for(int i = left; i < right; i++){
        if(cmp_y(T[i], S[mid])){
            U[a++] = T[i];
        }else if(S[mid].id == T[i].id){
            U[mid] = T[i];
        }else{
            U[b++] = T[i];
        }
    }
	T[mid] = U[mid];
	if(right - left < 5){
		for(int i = left; i < right; i++){ T[i] = U[i]; }
	}
}

void kd_tree(point *S, point *T, point *U, int left, int right, int d)
{
    if(right - left < 2) return;

	int f = d % 6;

	if(f == 0){ cycle_x(S, T, U, left, right); }
	if(f == 1){ cycle_y(U, S, T, left, right); }
	if(f == 2){ cycle_x(T, U, S, left, right); }
	if(f == 3){ cycle_y(S, T, U, left, right); }
	if(f == 4){ cycle_x(U, S, T, left, right); }
	if(f == 5){ cycle_y(T, U, S, left, right); }
	
	int mid = ((left + right) >> 1);

    kd_tree(S, T, U, left, mid, d + 1);
    kd_tree(S, T, U, mid + 1, right, d + 1);
}

int cnt;

void find_pt(int *Q, point *S, int sx, int tx, int sy, int ty, int left, int right, int d)
{
    if(left >= right) return;

    int mid = ((left + right) >> 1);
    point p = S[mid];
    int a = p.x, b = p.y;

    if(sx <= a && a <= tx && sy <= b && b <= ty){
        Q[cnt++] = p.id;
    }

    if((d & 1) == 0){
        if((left < mid) && (sx < a || (sx == a && sy <= b))){ find_pt(Q, S, sx, tx, sy, ty, left, mid, d + 1); }
        if((mid + 1 < right) && (a < tx || (a == tx && b <= ty))){ find_pt(Q, S, sx, tx, sy, ty, mid + 1, right, d + 1); }
    }else{
        if((left < mid) && (sy < b || (sy == b && sx <= a))){ find_pt(Q, S, sx, tx, sy, ty, left, mid, d + 1); }
        if((mid + 1 < right) && (b < ty || (b == ty && a <= tx))){ find_pt(Q, S, sx, tx, sy, ty, mid + 1, right, d + 1); }
    }
    return;
}

int main()
{
    point *S, *T, *U;
    int Q[100];
    int i, pos_x, pos_y, n;
    scanf("%d", &n);

    S = new point [n], T = new point [n], U = new point [n];

    for(i = 0; i < n; i++){
        scanf("%d %d", &pos_x, &pos_y);
        S[i] = init(pos_x, pos_y, i);
        T[i] = S[i];
    }
    sort(S, S + n, cmp_x);
    sort(T, T + n, cmp_y);

    kd_tree(S, T, U, 0, n, 0);

    int sx, tx, sy, ty, q;
    scanf("%d", &q);
    while(q){
        cnt = 0;
        scanf("%d %d %d %d", &sx, &tx, &sy, &ty);
        find_pt(Q, S, sx, tx, sy, ty, 0, n, 0);
        sort(Q, Q + cnt);
        for(int i = 0; i < cnt; i++){ printf("%d\n", Q[i]); }
        printf("\n");
        q--;
    }

    return 0;
}

Measured memory_bytes: 18328