#include <bits/stdc++.h>
using namespace std;
const int MAXR = 10000000;
char _READ_[MAXR], _PRINT_[MAXR];
int _READ_POS_, _PRINT_POS_, _READ_LEN_;
inline char readc() {
  if (!_READ_POS_) _READ_LEN_ = fread(_READ_, 1, MAXR, stdin);
  char c = _READ_[_READ_POS_++];
  if (_READ_POS_ == MAXR) _READ_POS_ = 0;
  if (_READ_POS_ > _READ_LEN_) return 0;
  return c;
}
template <typename T>
inline void read(T &x, T base = 10) {
  x = 0;
  register int flag = 1, c;
  while (((c = readc()) < '0' || c > '9') && c != '-')
    ;
  if (c == '-')
    flag = -1;
  else
    x = c - '0';
  while ((c = readc()) >= '0' && c <= '9') x = x * base + c - '0';
  x *= flag;
}
inline int reads(char *s) {
  register int len = 0, c;
  while (isspace(c = readc()) || !c)
    ;
  s[len++] = c;
  while (!isspace(c = readc()) && c) s[len++] = c;
  s[len] = 0;
  return len;
}
inline void ioflush() {
  fwrite(_PRINT_, 1, _PRINT_POS_, stdout), _PRINT_POS_ = 0;
  fflush(stdout);
}
inline void printc(char c) {
  _PRINT_[_PRINT_POS_++] = c;
  if (_PRINT_POS_ == MAXR) ioflush();
}
inline void prints(char *s) {
  for (int i = 0; s[i]; i++) printc(s[i]);
}
template <typename T>
inline void print(T x, char c = '\n') {
  if (x < 0) printc('-'), x = -x;
  if (x) {
    static char sta[20];
    register int tp = 0;
    for (; x; x /= 10) sta[tp++] = x % 10 + '0';
    while (tp > 0) printc(sta[--tp]);
  } else
    printc('0');
  printc(c);
}
const int MAXN = 300005, MAXT = 7000005;
int ls[MAXT], rs[MAXT], mx[MAXT], rt[MAXN], srt[MAXN], tot, n, m, K;
int build(int l = 1, int r = n) {
  int p = ++tot;
  if (l == r) return p;
  int mid = (l + r) >> 1;
  ls[p] = build(l, mid);
  rs[p] = build(mid + 1, r);
  return p;
}
int update(int pre, int x, int y, int l = 1, int r = n) {
  int p = ++tot;
  ls[p] = ls[pre], rs[p] = rs[pre];
  if (l == r) {
    mx[p] = max(mx[pre], y);
    return p;
  }
  int mid = (l + r) >> 1;
  if (x <= mid)
    ls[p] = update(ls[pre], x, y, l, mid);
  else
    rs[p] = update(rs[pre], x, y, mid + 1, r);
  mx[p] = min(mx[ls[p]], mx[rs[p]]);
  return p;
}
int query(int k, int a, int b, int l = 1, int r = n) {
  if (a > r || b < l) return INT_MAX;
  if (a <= l && b >= r) return mx[k];
  int mid = (l + r) >> 1;
  return min(query(ls[k], a, b, l, mid), query(rs[k], a, b, mid + 1, r));
}
struct Data {
  int l, r, p;
} da[MAXN];
bool cmp(const Data &a, const Data &b) { return a.r < b.r; }
int main() {
  scanf("%d%d%d", &n, &m, &K);
  for (int i = 1; i <= K; i++) scanf("%d%d%d", &da[i].l, &da[i].r, &da[i].p);
  sort(da + 1, da + K + 1, cmp);
  for (int i = 1; i <= K; i++) srt[i] = da[i].r;
  rt[0] = build();
  for (int i = 1; i <= K; i++) rt[i] = update(rt[i - 1], da[i].p, da[i].l);
  while (m--) {
    int a, b, x, y;
    scanf("%d%d%d%d", &a, &b, &x, &y);
    int r = upper_bound(srt + 1, srt + 1 + K, y) - srt - 1;
    puts(query(rt[r], a, b) >= x ? "yes" : "no");
    fflush(stdout);
  }
  return 0;
}
