#include <bits/stdc++.h>   using namespace std;   const int MAXN = 105000;   const int INF = 2100000000;   struct target {     int mi_n[2], ma_x[2], z, n;   };   struct point {     int min, n, dot, d[2], fa, l, r;   };   int n, m, root, now, txl, txr, tyl, tyr, ans[MAXN] = {0};   target rec[MAXN];   point t[MAXN];   void input_data() {     scanf( %d , &n);     for (int i = 1; i <= n; i++) {       scanf( %d%d%d%d%d , &rec[i].mi_n[0], &rec[i].ma_x[0], &rec[i].mi_n[1],             &rec[i].ma_x[1], &rec[i].z);       rec[i].n = i;     }     scanf( %d , &m);     for (int i = 1; i <= m; i++) {       scanf( %d%d , &t[i].d[0], &t[i].d[1]);       t[i].n = i;     }   }   bool cmp_1(point a, point b) { return a.d[now] < b.d[now]; }   void gengxin(int father, int son) {     if (t[father].min > t[son].min) {       t[father].min = t[son].min;       t[father].dot = t[son].dot;     }   }   void up_data(int rt) {     t[rt].min = t[rt].n;     t[rt].dot = rt;     if (t[rt].n == 0) {       t[rt].min = INF;       t[rt].dot = 0;     }     int l = t[rt].l, r = t[rt].r;     if (l) gengxin(rt, l);     if (r) gengxin(rt, r);   }   int build(int begin, int end, int fa, int fx) {     int m = (begin + end) >> 1;     now = fx;     nth_element(t + begin, t + m, t + end + 1, cmp_1);     t[m].fa = fa;     if (begin < m) t[m].l = build(begin, m - 1, m, 1 - fx);     if (m < end) t[m].r = build(m + 1, end, m, 1 - fx);     up_data(m);     return m;   }   bool inrange(int x, target b, int fx) {     return ((b.mi_n[fx] <= x) && (x <= b.ma_x[fx]));   }   int query(int rt, int fx, int r, int xl, int xr, int yl, int yr) {     if (!rt) return 0;     if (!t[rt].dot) return 0;     if (txl <= xl && xr <= txr && tyl <= yl && yr <= tyr) return t[rt].dot;     int t1 = 0, t2 = 0;     if (inrange(t[rt].d[fx], rec[r], fx)) {       if (fx == 0) {         t1 = query(t[rt].l, 1 - fx, r, xl, t[rt].d[0], yl, yr);         t2 = query(t[rt].r, 1 - fx, r, t[rt].d[0], xr, yl, yr);       } else {         t1 = query(t[rt].l, 1 - fx, r, xl, xr, yl, t[rt].d[1]);         t2 = query(t[rt].r, 1 - fx, r, xl, xr, t[rt].d[1], yr);       }     } else {       if (t[rt].d[fx] < rec[r].mi_n[fx]) {         if (fx == 0)           return query(t[rt].r, 1 - fx, r, t[rt].d[0], xr, yl, yr);         else           return query(t[rt].r, 1 - fx, r, xl, xr, t[rt].d[1], yr);       }       if (rec[r].ma_x[fx] < t[rt].d[fx]) {         if (fx == 0)           return query(t[rt].l, 1 - fx, r, xl, t[rt].d[0], yl, yr);         else           return query(t[rt].l, 1 - fx, r, xl, xr, yl, t[rt].d[1]);       }     }     int fi = 0;     int temp = INF;     if (t1 != 0)       if (t[t1].n < temp) {         temp = t[t1].n;         fi = t1;       }     if (t2 != 0)       if (t[t2].n < temp) {         temp = t[t2].n;         fi = t2;       }     if (t[rt].n != 0 && t[rt].n < temp)       if (inrange(t[rt].d[0], rec[r], 0) && inrange(t[rt].d[1], rec[r], 1)) {         temp = t[rt].n;         fi = rt;       }     return fi;   }   void adjust(int rt) {     up_data(rt);     if (rt != root) adjust(t[rt].fa);   }   bool cmp_2(target a, target b) { return a.z < b.z; }   void get_ans() {     root = build(1, m, 0, 0);     sort(rec + 1, rec + 1 + n, cmp_2);     for (int i = 1; i <= n; i++) {       txl = rec[i].mi_n[0], txr = rec[i].ma_x[0], tyl = rec[i].mi_n[1],       tyr = rec[i].ma_x[1];       int hit = query(root, 0, i, 0, INF, 0, INF);       if (hit != 0) {         ans[t[hit].n] = rec[i].n;         t[hit].n = 0;         adjust(hit);       }     }   }   void output_ans() {     for (int i = 1; i <= m; i++) printf( %d n , ans[i]);   }   int main() {     input_data();     get_ans();     output_ans();     return 0;   }