#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, flag = 1;
  char ch = getchar();
  for (; ch > '9' || ch < '0'; ch = getchar())
    if (ch == '-') flag = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar())
    x = (x << 3) + (x << 1) + ch - '0';
  return x * flag;
}
const int MAXN = 2e5 + 50, B = 317, INF = 998244353;
int n, m, Ans[MAXN], rt, cnt = 0;
int XX[MAXN], YY[MAXN], DY[MAXN], Cl = 0;
struct Point {
  int x, y, id;
} P[MAXN];
struct Ques {
  int X1, Y1, X2, Y2, id, h;
} Q[MAXN];
struct Tree {
  int X, Y, Min, ls, rs, dat, fa;
  int mx[2], my[2];
  void clean() {
    X = Y = ls = rs = mx[1] = my[1] = 0;
    mx[0] = my[0] = dat = Min = INF;
  }
} T[MAXN];
int MIN(int a, int b) { return a < b ? a : b; }
bool cmp3(Point a, Point b) { return a.y < b.y; }
bool cmp2(Point a, Point b) { return a.x < b.x; }
bool cmp(Ques a, Ques b) { return a.h < b.h; }
void update(int cur) {
  T[cur].Min = MIN(T[T[cur].rs].Min, T[T[cur].ls].Min);
  T[cur].Min = MIN(T[cur].Min, T[cur].dat);
  T[cur].mx[0] = MIN(MIN(T[T[cur].rs].mx[0], T[T[cur].ls].mx[0]), T[cur].mx[0]);
  T[cur].my[0] = MIN(MIN(T[T[cur].rs].my[0], T[T[cur].ls].my[0]), T[cur].my[0]);
  T[cur].mx[1] = max(max(T[T[cur].rs].mx[1], T[T[cur].ls].mx[1]), T[cur].mx[1]);
  T[cur].my[1] = max(max(T[T[cur].rs].my[1], T[T[cur].ls].my[1]), T[cur].my[1]);
}
void build(int &cur, int L, int R, int D, int fa) {
  if (L > R) return;
  if (!cur) cur = ++cnt;
  int mid = (L + R) >> 1;
  T[cur].fa = fa;
  if (L == R) {
    int x = P[L].x, y = P[L].y;
    T[cur].mx[0] = T[cur].mx[1] = T[cur].X = x;
    T[cur].my[0] = T[cur].my[1] = T[cur].Y = y;
    T[cur].dat = T[cur].Min = P[L].id;
    DY[P[L].id] = cur;
    return;
  }
  if (D == 0)
    nth_element(P + L, P + mid, P + 1 + R, cmp2);
  else
    nth_element(P + L, P + mid, P + 1 + R, cmp3);
  T[cur].dat = P[mid].id, T[cur].X = P[mid].x, T[cur].Y = P[mid].y;
  T[cur].mx[0] = T[cur].mx[1] = T[cur].X;
  T[cur].my[0] = T[cur].my[1] = T[cur].Y;
  DY[P[mid].id] = cur;
  build(T[cur].ls, L, mid - 1, D ^ 1, cur);
  build(T[cur].rs, mid + 1, R, D ^ 1, cur);
  update(cur);
  return;
}
bool out(int x, int X1, int Y1, int X2, int Y2) {
  return (T[x].mx[0] > X2 || T[x].mx[1] < X1 || T[x].my[0] > Y2 ||
          T[x].my[1] < Y1);
}
bool in(int x, int X1, int Y1, int X2, int Y2) {
  return (T[x].mx[0] >= X1 && T[x].mx[1] <= X2 && T[x].my[0] >= Y1 &&
          T[x].my[1] <= Y2);
}
int query(int now, int X1, int Y1, int X2, int Y2) {
  int Min = INF;
  if (T[now].X >= X1 && T[now].Y >= Y1 && T[now].X <= X2 && T[now].Y <= Y2)
    Min = T[now].dat;
  if (out(now, X1, Y1, X2, Y2) || !now) return Min;
  if (in(now, X1, Y1, X2, Y2)) return min(T[now].Min, T[now].dat);
  if (T[now].ls) Min = MIN(Min, query(T[now].ls, X1, Y1, X2, Y2));
  if (T[now].rs) Min = MIN(Min, query(T[now].rs, X1, Y1, X2, Y2));
  return Min;
}
void Go(int x, int t) {
  if (!x) return;
  if (T[x].dat == t) T[x].dat = INF;
  update(x);
  Go(T[x].fa, t);
  return;
}
void clean() {
  for (int i = 1; i <= cnt; i++) T[i].clean();
  cnt = 0;
}
int main() {
  n = read();
  T[0].clean();
  for (int i = 1; i <= n; i++) Ans[i] = -1;
  for (int i = 1; i <= n; i++) {
    Q[i].X1 = read(), Q[i].X2 = read();
    Q[i].Y1 = read(), Q[i].Y2 = read();
    Q[i].h = read(), Q[i].id = i;
  }
  rt = 0;
  m = read();
  sort(Q + 1, Q + 1 + n, cmp);
  for (int i = 1; i <= m; i++) {
    XX[i] = P[i].x = read(), YY[i] = P[i].y = read();
    P[i].id = i;
  }
  build(rt, 1, m, 0, 0);
  for (int i = 1; i <= n; i++) {
    int t = query(rt, Q[i].X1, Q[i].Y1, Q[i].X2, Q[i].Y2);
    if (t == 998244353 || !t) continue;
    Ans[t] = Q[i].id, Go(DY[t], t);
  }
  for (int i = 1; i <= m; i++) printf("%d\n", max(Ans[i], 0));
  return 0;
}
