#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 7;
string to_string(string s) { return '"' + s + '"'; }
string to_string(char s) { return string(1, s); }
string to_string(const char* s) { return to_string((string)s); }
string to_string(bool b) { return (b ? "true" : "false"); }
template <typename A>
string to_string(A);
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A>
string to_string(A v) {
  bool f = 1;
  string r = "{";
  for (const auto& x : v) {
    if (!f) r += ", ";
    f = 0;
    r += to_string(x);
  }
  return r + "}";
}
void debug_out() { cout << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cout << " " << to_string(H);
  debug_out(T...);
}
const int N = 2e7;
int ctr = 1;
int L[N], R[N], T[N];
int node(int x) {
  ++ctr;
  T[ctr] = x;
  return ctr;
}
int upd(int no, int l, int r, int pos, int val) {
  if (l == r) {
    return node(min(T[no], val));
  }
  int now = node(inf);
  L[now] = L[no], R[now] = R[no];
  if (pos <= ((l + r) >> 1))
    L[now] = upd(L[no], l, ((l + r) >> 1), pos, val);
  else
    R[now] = upd(R[no], ((l + r) >> 1) + 1, r, pos, val);
  T[now] = max(T[L[now]], T[R[now]]);
  return now;
}
int qry(int no, int l, int r, int u, int v) {
  if (r < u or l > v) return 0;
  if (l >= u and r <= v) return T[no];
  return max(qry(L[no], l, ((l + r) >> 1), u, v),
             qry(R[no], ((l + r) >> 1) + 1, r, u, v));
}
int main() {
  int n, m, k;
  scanf("%d %d %d", &n, &m, &k);
  T[0] = inf;
  vector<vector<pair<int, int>>> a(n);
  map<int, vector<pair<int, int>>> mp;
  for (auto i = (0); i <= (k - 1); ++i) {
    int l, r, p;
    scanf("%d %d %d", &l, &r, &p);
    a[p - 1].emplace_back(l, r);
  }
  for (auto i = (0); i <= (n - 1); ++i) {
    sort((a[i]).begin(), (a[i]).end());
    auto b = a[i];
    a[i].clear();
    for (pair<int, int> x : b) {
      while (!a[i].empty() and a[i].back().second >= x.second) a[i].pop_back();
      if (a[i].empty() or
          (x.first > a[i].back().first and x.second > a[i].back().second)) {
        a[i].push_back(x);
      }
    }
    for (auto it : a[i]) mp[-it.first].emplace_back(it.second, i);
  }
  map<int, int> root;
  int prv = 0;
  root[inf] = 0;
  for (auto it : mp) {
    int l = -it.first;
    root[l] = prv;
    for (auto itt : it.second) {
      int r = itt.first, idx = itt.second + 1;
      root[l] = upd(root[l], 1, n, idx, r);
    }
    prv = root[l];
  }
  while (m--) {
    int a, b, x, y;
    scanf("%d %d %d %d", &a, &b, &x, &y);
    int it = root.lower_bound(x)->second;
    printf(qry(it, 1, n, a, b) <= y ? "yes\n" : "no\n");
    fflush(stdout);
  }
  return 0;
}
