#include <bits/stdc++.h>
using namespace std;
int B[6 * 100005];
int tree[100005 * 6], Min[100005 * 126], Lson[100005 * 126], Rson[100005 * 126];
int n, q, k, m, Cnt, a, b, l, r;
int L[3 * 100005], R[3 * 100005], p[3 * 100005];
vector<int> E[6 * 100005];
void Update(int &rt, int ot, int L, int R, int x, int i) {
  rt = ++Cnt;
  Lson[rt] = Lson[ot];
  Rson[rt] = Rson[ot];
  if (L == R) {
    Min[rt] = max(Min[ot], x);
    return;
  }
  int Mid = L + R >> 1;
  if (i <= Mid)
    Update(Lson[rt], Lson[ot], L, Mid, x, i);
  else
    Update(Rson[rt], Rson[ot], Mid + 1, R, x, i);
  Min[rt] = min(Min[Lson[rt]], Min[Rson[rt]]);
}
bool Query(int rt, int L, int R) {
  if (a <= L && R <= b) {
    return Min[rt] >= l;
  }
  int Mid = L + R >> 1;
  bool flag = 1;
  if (a <= Mid) flag &= Query(Lson[rt], L, Mid);
  if (b > Mid) flag &= Query(Rson[rt], Mid + 1, R);
  return flag;
}
int main() {
  scanf("%d%d%d", &n, &q, &k);
  for (int i = 1; i <= k; i++) {
    scanf("%d%d%d", L + i, R + i, p + i);
    B[++m] = L[i], B[++m] = R[i];
  }
  sort(B + 1, B + 1 + m), m = unique(B + 1, B + 1 + m) - B - 1;
  for (int i = 1; i <= k; i++) {
    L[i] = lower_bound(B + 1, B + 1 + m, L[i]) - B;
    R[i] = lower_bound(B + 1, B + 1 + m, R[i]) - B;
    E[R[i]].push_back(i);
  }
  for (int i = 1; i <= m; i++) {
    tree[i] = tree[i - 1];
    bool flag = 0;
    for (int j = 0; j < E[i].size(); j++) {
      int t = E[i][j];
      if (!flag)
        Update(tree[i], tree[i - 1], 1, n, L[t], p[t]), flag = 1;
      else
        Update(tree[i], tree[i], 1, n, L[t], p[t]);
    }
  }
  while (q--) {
    scanf("%d%d%d%d", &a, &b, &l, &r);
    l = lower_bound(B + 1, B + 1 + m, l) - B;
    r = upper_bound(B + 1, B + 1 + m, r) - B - 1;
    puts(Query(tree[r], 1, n) ? "yes" : "no");
    fflush(stdout);
  }
}
