#include <bits/stdc++.h>
using namespace std;
class segtree {
 public:
  struct node {
    vector<pair<int, int>> val = {};
    void apply(vector<pair<int, int>> v) { val = v; }
  };
  node unite(const node &a, const node &b) {
    node res;
    for (auto i : a.val) {
      auto m = lower_bound(b.val.begin(), b.val.end(), make_pair(i.first, 0));
      if (m == b.val.end()) break;
      res.val.push_back(make_pair(i.first, max(i.second, m->second)));
    }
    for (auto i : b.val) {
      auto m = lower_bound(a.val.begin(), a.val.end(), make_pair(i.first, 0));
      if (m == a.val.end()) break;
      res.val.push_back(make_pair(i.first, max(i.second, m->second)));
    }
    sort(res.val.begin(), res.val.end());
    vector<pair<int, int>> v;
    for (auto i : res.val) {
      while (v.size() && v.back().second >= i.second) v.pop_back();
      v.push_back(i);
    }
    res.val.clear();
    res.val = v;
    return res;
  }
  inline void pull(int x, int z) { tree[x] = unite(tree[x + 1], tree[z]); }
  int n;
  vector<node> tree;
  template <typename M>
  void build(int x, int l, int r, const vector<M> &v) {
    if (l == r) {
      tree[x].apply(v[l]);
      return;
    }
    int y = (l + r) >> 1;
    int z = x + ((y - l + 1) << 1);
    build(x + 1, l, y, v);
    build(z, y + 1, r, v);
    pull(x, z);
  }
  bool check(int x, int l, int r) {
    auto p =
        upper_bound(tree[x].val.begin(), tree[x].val.end(), make_pair(l, 0));
    if (p == tree[x].val.end()) return 0;
    return p->second <= r;
  }
  bool get(int x, int l, int r, int ll, int rr, int u, int v) {
    if (ll <= l && rr >= r) {
      return check(x, u, v);
    }
    int y = (l + r) >> 1;
    int z = x + ((y - l + 1) << 1);
    if (rr <= y) {
      return get(x + 1, l, y, ll, rr, u, v);
    } else {
      if (ll > y) {
        return get(z, y + 1, r, ll, rr, u, v);
      } else {
        return get(x + 1, l, y, ll, rr, u, v) && get(z, y + 1, r, ll, rr, u, v);
      }
    }
  }
  template <typename M>
  segtree(const vector<M> &v) {
    n = v.size();
    assert(n > 0);
    tree.resize(2 * n - 1);
    build(0, 0, n - 1, v);
  }
  bool get(int ll, int rr, int u, int v) {
    assert(0 <= ll && ll <= rr && rr <= n - 1);
    return get(0, 0, n - 1, ll, rr, u, v);
  }
};
int m, n, k, l, r, p, a, b, x, y;
vector<vector<pair<int, int>>> foo;
int main() {
  scanf("%d%d%d", &n, &m, &k);
  foo.resize(n);
  for (int i = 0; i < k; i++) {
    scanf("%d%d%d", &l, &r, &p);
    p--;
    foo[p].push_back(make_pair(l, r));
  }
  for (int i = 0; i < n; i++) {
    sort(foo[i].begin(), foo[i].end());
    vector<pair<int, int>> ver;
    for (int j = 0; j < (int)foo[i].size(); j++) {
      auto u = foo[i][j];
      while (ver.size() && ver.back().second >= u.second) ver.pop_back();
      ver.push_back(u);
    }
    foo[i].clear();
    foo[i] = ver;
  }
  segtree res(foo);
  while (m--) {
    scanf("%d%d%d%d", &a, &b, &x, &y);
    a--;
    b--;
    if (res.get(a, b, x, y))
      printf("yes\n");
    else
      printf("no\n");
    fflush(stdout);
  }
  return 0;
}
