#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int K = 3e5 + 10;
const int INF = 2e9;
vector<vector<pair<int, int> > > mas(N);
struct segment_tree {
  vector<vector<pair<int, int> > > fun;
  segment_tree(int n) : fun(4 * n) {}
  void build(int l, int r, int v) {
    if (l == r) {
      fun[v] = mas[l];
      sort(fun[v].begin(), fun[v].end());
      for (int i = (int)fun[v].size() - 2; i >= 0; --i) {
        fun[v][i].second = min(fun[v][i].second, fun[v][i + 1].second);
      }
      return;
    }
    int m = (l + r) >> 1;
    build(l, m, v * 2 + 1);
    build(m + 1, r, v * 2 + 2);
    for (pair<int, int> s : fun[v * 2 + 1]) fun[v].push_back(s);
    for (pair<int, int> s : fun[v * 2 + 2]) fun[v].push_back(s);
    sort(fun[v].begin(), fun[v].end());
    for (pair<int, int>& p : fun[v]) {
      p.second = -INF;
      auto it = lower_bound(fun[v * 2 + 1].begin(), fun[v * 2 + 1].end(),
                            make_pair(p.first, 0));
      if (it != fun[v * 2 + 1].end()) {
        p.second = max(p.second, (*it).second);
      }
      it = lower_bound(fun[v * 2 + 2].begin(), fun[v * 2 + 2].end(),
                       make_pair(p.first, 0));
      if (it != fun[v * 2 + 2].end()) {
        p.second = max(p.second, (*it).second);
      }
    }
  }
  int get(int l, int r, int tl, int tr, int v, int x) {
    if (l > tr || r < tl) {
      return -INF;
    }
    if (l <= tl && tr <= r) {
      int id =
          (int)(lower_bound(fun[v].begin(), fun[v].end(), make_pair(x, 0)) -
                fun[v].begin());
      if (id == fun[v].size())
        return INF;
      else
        return fun[v][id].second;
    } else {
      int tm = (tl + tr) >> 1;
      return max(get(l, r, tl, tm, v * 2 + 1, x),
                 get(l, r, tm + 1, tr, v * 2 + 2, x));
    }
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  for (int i = 1; i <= n; ++i) {
    mas[i].push_back({INF, INF});
  }
  for (int i = 0; i < k; ++i) {
    int l, r, p;
    cin >> l >> r >> p;
    mas[p].push_back({l, r});
  }
  segment_tree t(n + 1);
  t.build(0, n, 0);
  while (m--) {
    int a, b, x, y;
    cin >> a >> b >> x >> y;
    int r = t.get(a, b, 0, n, 0, x);
    if (r <= y) {
      cout << "yes" << endl;
    } else {
      cout << "no" << endl;
    }
  }
  return 0;
}
