#include <bits/stdc++.h>
using namespace std;
int n, m, K;
struct node {
  int l, r, p;
  inline friend bool operator<(const node &u, const node &v) {
    return u.l > v.l;
  }
} A[300010];
struct zhuxi {
  int v, ch[2];
} T[300010 * 20];
int rt[300010], top;
inline void maintain(int i) { T[i].v = max(T[T[i].ch[0]].v, T[T[i].ch[1]].v); }
void update(int &i, int j, int l, int r, int k, int v) {
  i = ++top;
  T[i] = T[j];
  int m = l + r >> 1;
  if (l == r) {
    T[i].v = min(T[i].v, v);
    return;
  }
  if (k <= m)
    update(T[i].ch[0], T[j].ch[0], l, m, k, v);
  else
    update(T[i].ch[1], T[j].ch[1], m + 1, r, k, v);
  maintain(i);
}
int query(int i, int l, int r, int L, int R) {
  if (l > R || r < L) return 0;
  if (!i) return 1000000010;
  if (L <= l && r <= R) return T[i].v;
  int m = l + r >> 1;
  return max(query(T[i].ch[0], l, m, L, R), query(T[i].ch[1], m + 1, r, L, R));
}
int main() {
  scanf("%d%d%d", &n, &m, &K);
  for (int i = 1; i <= K; ++i) scanf("%d%d%d", &A[i].l, &A[i].r, &A[i].p);
  sort(A + 1, A + K + 1);
  T[0].v = 1000000010;
  for (int i = 1; i <= K; ++i) update(rt[i], rt[i - 1], 1, n, A[i].p, A[i].r);
  for (int i = 1; i <= m; ++i) {
    int x, y, a, b, p;
    scanf("%d%d%d%d", &a, &b, &x, &y);
    node t;
    t.l = x;
    p = upper_bound(A + 1, A + K + 1, t) - A;
    puts(query(rt[p - 1], 1, n, a, b) <= y ? "yes" : "no");
    fflush(stdout);
  }
  return 0;
}
