#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vb = vector<bool>;
using vs = vector<string>;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int N, M, K;
  cin >> N >> M >> K;
  vector<vector<array<int, 2>>> sets(N);
  for (int i = 0; i < K; i++) {
    int l, r, p;
    cin >> l >> r >> p;
    sets[p - 1].push_back({l, r});
  }
  for (int i = 0; i < N; i++) {
    sort((sets[i]).begin(), (sets[i]).end());
  }
  const int GROUP_SIZE = sqrt(K);
  vector<array<int, 2>> groups;
  for (int i = 0, j; i < N; i = j) {
    j = i + 1;
    for (int sz = sets[i].size(); j < N && sz + sets[j].size() < GROUP_SIZE;
         j++)
      sz += sets[j].size();
    groups.push_back({i, j - 1});
  }
  int G = groups.size();
  vvi vals(G);
  vvi req(groups.size());
  for (int g = 0; g < G; g++) {
    int g0 = groups[g][0], g1 = groups[g][1];
    vector<array<int, 3>> segs;
    for (int k = g0; k <= g1; k++) {
      for (auto [l, r] : sets[k]) {
        segs.push_back({l, r, k});
        vals[g].push_back(l);
        vals[g].push_back(r);
      }
    }
    sort((segs).begin(), (segs).end());
    sort((vals[g]).begin(), (vals[g]).end());
    vals[g].erase(unique((vals[g]).begin(), (vals[g]).end()), vals[g].end());
    vi low(N, INT_MAX);
    int seen = 0;
    priority_queue<array<int, 2>> lows;
    req[g].resize(vals[g].size());
    for (int inx = vals[g].size() - 1, ins = segs.size(); inx >= 0; inx--) {
      for (; ins > 0 && segs[ins - 1][0] == vals[g][inx]; ins--) {
        if (segs[ins - 1][1] < low[segs[ins - 1][2]]) {
          if (low[segs[ins - 1][2]] == INT_MAX) seen++;
          low[segs[ins - 1][2]] = segs[ins - 1][1];
          lows.push({segs[ins - 1][1], segs[ins - 1][2]});
        }
      }
      while (!lows.empty() && lows.top()[0] != low[lows.top()[1]]) lows.pop();
      req[g][inx] = (seen == (g1 - g0 + 1) ? lows.top()[0] : INT_MAX);
    }
  }
  for (int q = 0; q < M; q++) {
    int a, b, x, y;
    cin >> a >> b >> x >> y;
    a--, b--;
    bool ok = true;
    for (int g = 0; g < G; g++) {
      int g0 = groups[g][0], g1 = groups[g][1];
      if (a <= g0 && g1 <= b) {
        auto it = lower_bound((vals[g]).begin(), (vals[g]).end(), x);
        ok &= (it != vals[g].end()) && req[g][it - vals[g].begin()] <= y;
      } else if (max(a, g0) <= min(b, g1)) {
        for (int s = max(a, g0); s <= min(b, g1); s++) {
          bool got = false;
          for (auto [l, r] : sets[s]) {
            if (x <= l && r <= y) got = true;
          }
          ok &= got;
        }
      }
    }
    cout << (ok ? "yes" : "no") << endl;
  }
  return 0;
}
