#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;
}
