#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, m, k;
struct segment {
  int l, r, id;
  friend inline bool operator<(const segment &a, const segment &b) {
    return a.l > b.l;
  }
} t[N];
int root[N];
namespace SegmentTree {
const int M = N << 5, inf = 0x3f3f3f3f;
int num, lc[M], rc[M], Min[M];
inline void init(void) { memset(Min, inf, sizeof Min); }
inline void insert(int &p, int last, int l, int r, int pos, int val) {
  p = ++num;
  Min[p] = Min[last];
  lc[p] = lc[last];
  rc[p] = rc[last];
  if (l == pos && r == pos) {
    Min[p] = min(Min[p], val);
    return;
  }
  int mid = (l + r) >> 1;
  if (pos <= mid)
    insert(lc[p], lc[last], l, mid, pos, val);
  else
    insert(rc[p], rc[last], mid + 1, r, pos, val);
  Min[p] = max(Min[lc[p]], Min[rc[p]]);
}
inline int query(int p, int l, int r, int L, int R) {
  if (L <= l && r <= R) return Min[p];
  int mid = (l + r) >> 1, res = 0;
  if (L <= mid) res = max(res, query(lc[p], l, mid, L, R));
  if (R > mid) res = max(res, query(rc[p], mid + 1, r, L, R));
  return res;
}
}  // namespace SegmentTree
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m >> k;
  for (int i = 1; i <= k; i++) cin >> t[i].l >> t[i].r >> t[i].id;
  sort(t + 1, t + k + 1);
  SegmentTree::init();
  for (int i = 1; i <= k; i++)
    SegmentTree::insert(root[i], root[i - 1], 1, n, t[i].id, t[i].r);
  while (m--) {
    int a, b, x, y;
    cin >> a >> b >> x >> y;
    int l = 1, r = k, pos = 0;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if (t[mid].l >= x) {
        l = mid + 1;
        pos = mid;
      } else
        r = mid - 1;
    }
    int res = SegmentTree::query(root[pos], 1, n, a, b);
    if (res <= y)
      cout << "yes" << endl;
    else
      cout << "no" << endl;
    fflush(stdout);
  }
  return 0;
}
