#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
int n, m, cnt, k;
struct node {
  int l, r, sum = 1999999999;
} g[maxn * 20];
inline int read() {
  register int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();
  return x * f;
}
struct value {
  int x, y, id;
} x[maxn];
bool cmp(value v1, value v2) { return v1.x > v2.x; }
int root[maxn];
void update(int num, int wht, int &rt, int l, int r) {
  g[++cnt] = g[rt];
  if (l == r) {
    g[cnt].sum = min(g[rt].sum, wht);
    rt = cnt;
    return;
  }
  rt = cnt;
  int mid = l + r >> 1;
  if (num <= mid)
    update(num, wht, g[rt].l, l, mid);
  else
    update(num, wht, g[rt].r, mid + 1, r);
  g[rt].sum = max(g[g[rt].l].sum, g[g[rt].r].sum);
}
int query(int rt, int l, int r, int lb, int rb) {
  if (lb >= l && rb <= r) return g[rt].sum;
  if (lb > r || l > rb) return -1999999999;
  int mid = lb + rb >> 1;
  return max(query(g[rt].l, l, r, lb, mid), query(g[rt].r, l, r, mid + 1, rb));
}
int main() {
  cnt = 1;
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= k; i++) {
    x[i].x = read(), x[i].y = read(), x[i].id = read();
  }
  sort(x + 1, x + 1 + k, cmp);
  for (int i = 1; i <= k; i++) {
    root[i] = root[i - 1];
    update(x[i].id, x[i].y, root[i], 1, n);
  }
  while (m--) {
    int A = read(), B = read(), X = read(), Y = read();
    int lb = 1, asn = -1, rb = k;
    while (lb <= rb) {
      int mid = lb + rb >> 1;
      if (x[mid].x >= X) {
        lb = mid + 1;
        asn = mid;
      } else {
        rb = mid - 1;
      }
    }
    int ans = query(root[asn], A, B, 1, n);
    if (ans <= Y)
      printf("yes\n");
    else
      printf("no\n");
    fflush(stdout);
  }
  return 0;
}
