#include <bits/stdc++.h>
using namespace std;
struct Segment {
  int l, r, p;
  Segment(int a = 0, int b = 0, int c = 0) : l(a), r(b), p(c) {}
  bool operator<(const Segment& b) const { return l > b.l; }
};
const int maxn = 3e5 + 5;
const int maxm = maxn * 20;
const int INF = 0x3f3f3f3f;
int root[maxn], tot;
int T[maxm], L[maxm], R[maxm];
void update(int& rt, int l, int r, int p, int val) {
  T[++tot] = T[rt];
  L[tot] = L[rt], R[tot] = R[rt];
  rt = tot;
  if (l == r)
    T[rt] = min(T[rt], val);
  else {
    int mid = (l + r) / 2;
    if (p <= mid)
      update(L[rt], l, mid, p, val);
    else
      update(R[rt], mid + 1, r, p, val);
    T[rt] = max(T[L[rt]], T[R[rt]]);
  }
}
int query(int rt, int l, int r, int a, int b) {
  if (!rt) return INF;
  if (a <= l && r <= b) return T[rt];
  int mid = (l + r) / 2;
  if (b <= mid)
    return query(L[rt], l, mid, a, b);
  else if (mid < a)
    return query(R[rt], mid + 1, r, a, b);
  else
    return max(query(L[rt], l, mid, a, b), query(R[rt], mid + 1, r, a, b));
}
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  vector<Segment> Segs(k);
  for (auto& v : Segs) {
    scanf("%d%d%d", &v.l, &v.r, &v.p);
  }
  sort(Segs.begin(), Segs.end());
  T[0] = INF, L[0] = 0, R[0] = 0;
  for (int i = 1; i <= k; i++) {
    update(root[i] = root[i - 1], 1, n, Segs[i - 1].p, Segs[i - 1].r);
  }
  while (m--) {
    int a, b, x, y;
    scanf("%d%d%d%d", &a, &b, &x, &y);
    int p = upper_bound(Segs.begin(), Segs.end(), Segment(x)) - Segs.begin();
    if (query(root[p], 1, n, a, b) <= y)
      puts("yes");
    else
      puts("no");
    fflush(stdout);
  }
}
