#include <bits/stdc++.h>
using namespace std;
const int M = 3e6 + 10;
int n, m, k;
struct Line {
  int l, r, val;
  void in() { scanf("%d%d%d", &l, &r, &val); }
  Line() {}
  Line(int a, int b, int c) : l(a), r(b), val(c) {}
  bool operator<(const Line &a) const {
    return l > a.l || (l == a.l && r > a.r);
  }
} L[M];
const int inf = 1e9 + 10;
int root[M], minv[M << 2], ls[M << 2], rs[M << 2], tot;
void pushup(int o) { minv[o] = max(minv[ls[o]], minv[rs[o]]); }
void update(int pre, int &o, int l, int r, int p, int v) {
  o = ++tot;
  ls[o] = ls[pre];
  rs[o] = rs[pre];
  minv[o] = minv[pre];
  if (l == r) {
    minv[o] = min(minv[o], v);
    return;
  }
  int mid = l + r >> 1;
  if (p <= mid)
    update(ls[pre], ls[o], l, mid, p, v);
  else
    update(rs[pre], rs[o], mid + 1, r, p, v);
  pushup(o);
}
int query(int o, int l, int r, int L, int R) {
  if (!o) return inf;
  if (L <= l && r <= R) return minv[o];
  int mid = l + r >> 1;
  if (L > mid)
    return query(rs[o], mid + 1, r, L, R);
  else if (R <= mid)
    return query(ls[o], l, mid, L, R);
  else
    return max(query(ls[o], l, mid, L, R), query(rs[o], mid + 1, r, L, R));
}
int a, b, x, y;
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= k; i++) L[i].in();
  sort(L + 1, L + k + 1);
  memset(minv, 127, sizeof(minv));
  for (int i = 1; i <= k; i++)
    update(root[i - 1], root[i], 1, n, L[i].val, L[i].r);
  while (m--) {
    scanf("%d%d%d%d", &a, &b, &x, &y);
    int p = lower_bound(L + 1, L + k + 1, Line(x, 0, 0)) - L - 1;
    int t = query(root[p], 1, n, a, b);
    if (t <= y)
      puts("yes");
    else
      puts("no");
    fflush(stdout);
  }
  return 0;
}
