#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 * 20;
const int K = 3e5 + 10;
const int inf = 0x7fffffff;
struct seg {
  int lc, rc, val;
} T[N];
int n, m, k, totn, root[K];
void insert(int p, int& o, int l, int r, int pos, int d) {
  o = ++totn;
  T[o] = T[p];
  if (l == r) {
    T[o].val = max(T[o].val, d);
    return;
  }
  int mid = l + r >> 1;
  if (pos <= mid)
    insert(T[p].lc, T[o].lc, l, mid, pos, d);
  else
    insert(T[p].rc, T[o].rc, mid + 1, r, pos, d);
  T[o].val = min(T[T[o].lc].val, T[T[o].rc].val);
  return;
}
int query(int o, int l, int r, int L, int R) {
  if (L <= l && r <= R) return T[o].val;
  int ret = inf, mid = l + r >> 1;
  if (L <= mid) ret = min(ret, query(T[o].lc, l, mid, L, R));
  if (R > mid) ret = min(ret, query(T[o].rc, mid + 1, r, L, R));
  return ret;
}
struct node {
  int l, r, id;
  bool operator<(const node& a) const { return r < a.r; }
} li[K];
int main() {
  cin >> n >> m >> k;
  for (int i = 1; i <= k; i++) scanf("%d%d%d", &li[i].l, &li[i].r, &li[i].id);
  sort(li + 1, li + k + 1);
  li[k + 1] = (node){0, inf, 0};
  for (int i = 1; i <= k; i++)
    insert(root[i - 1], root[i], 1, n, li[i].id, li[i].l);
  for (int a, b, x, y, pos, i = 1; i <= m; i++) {
    scanf("%d%d%d%d", &a, &b, &x, &y);
    pos = lower_bound(li + 1, li + k + 2, (node){0, y + 1, 0}) - li - 1;
    if (query(root[pos], 1, n, a, b) >= x)
      printf("yes\n");
    else
      printf("no\n");
    fflush(stdout);
  }
  return 0;
}
