#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int tree[20000005];
int lft[20000005];
int rgt[20000005];
int root[600005];
vector<int> c;
vector<pair<long long int, long long int>> at[600005];
vector<pair<pair<long long int, long long int>, int>> seg;
int cur = 1;
int make_new() {
  tree[cur] = 1e9;
  lft[cur] = -1;
  rgt[cur] = -1;
  cur++;
  return cur - 1;
}
void build(int l, int r, int i) {
  if (l == r) return;
  int mid = (l + r) >> 1;
  lft[i] = make_new();
  rgt[i] = make_new();
  build(l, mid, lft[i]);
  build(mid + 1, r, rgt[i]);
}
void upd(int l, int s, int e, int i, int x) {
  if (s == e) {
    tree[i] = min(tree[i], x);
    return;
  }
  int mid = (s + e) >> 1;
  if (l <= mid) {
    int y = make_new();
    tree[y] = tree[lft[i]];
    lft[y] = lft[lft[i]];
    rgt[y] = rgt[lft[i]];
    lft[i] = y;
    upd(l, s, mid, lft[i], x);
  } else {
    int y = make_new();
    tree[y] = tree[rgt[i]];
    lft[y] = lft[rgt[i]];
    rgt[y] = rgt[rgt[i]];
    rgt[i] = y;
    upd(l, mid + 1, e, rgt[i], x);
  }
  tree[i] = max(tree[lft[i]], tree[rgt[i]]);
}
int qur(int l, int r, int s, int e, int i) {
  if (s > r || e < l) return 0;
  if (s >= l && e <= r) return tree[i];
  int mid = (s + e) >> 1;
  return max(qur(l, r, s, mid, lft[i]), qur(l, r, mid + 1, e, rgt[i]));
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> k;
  for (int i = 1; i <= k; i++) {
    int l, r, p;
    cin >> l >> r >> p;
    c.push_back(l);
    c.push_back(r);
    seg.push_back({{l, r}, p});
  }
  sort(seg.begin(), seg.end());
  sort(c.begin(), c.end());
  c.resize(distance(c.begin(), unique(c.begin(), c.end())));
  for (auto &j : seg) {
    j.first.first =
        lower_bound(c.begin(), c.end(), j.first.first) - c.begin() + 1;
    j.first.second =
        lower_bound(c.begin(), c.end(), j.first.second) - c.begin() + 1;
    at[j.first.first].push_back({j.first.second, j.second});
  }
  root[2 * k + 1] = make_new();
  build(1, n, root[2 * k + 1]);
  for (int i = 2 * k; i >= 1; i--) {
    root[i] = make_new();
    tree[root[i]] = tree[root[i + 1]];
    lft[root[i]] = lft[root[i + 1]];
    rgt[root[i]] = rgt[root[i + 1]];
    for (auto j : at[i]) upd(j.second, 1, n, root[i], j.first);
  }
  for (int i = 1; i <= m; i++) {
    int a, b, x, y;
    cin >> a >> b >> x >> y;
    x = lower_bound(c.begin(), c.end(), x) - c.begin() + 1;
    y = upper_bound(c.begin(), c.end(), y) - c.begin();
    if (qur(a, b, 1, n, root[x]) > y)
      cout << "no" << endl;
    else
      cout << "yes" << endl;
  }
  return 0;
}
