#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops")
using namespace std;
const int inf = numeric_limits<int>::max() / 2;
const long double eps = 1e-9;
const long double pi = acos(-1);
inline void solve(), read();
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  read();
  solve();
  return 0;
}
struct segment {
  int n;
  vector<int> t;
  segment() {}
  segment(int n_) {
    int l = log2(n_) + 1;
    n = 1ll << l;
    t.resize(2 * n);
  }
  void upd(int v, int x) {
    v += n;
    t[v] = x;
    while (v > 1) {
      v /= 2;
      t[v] = min(t[2 * v], t[2 * v + 1]);
    }
  }
  int get(int v, int tl, int tr, int l, int r) {
    if (tl > r || tr < l) {
      return inf;
    }
    if (l <= tl && tr <= r) {
      return t[v];
    }
    int tm = (tl + tr) / 2;
    int v1 = get(2 * v, tl, tm, l, r);
    int v2 = get(2 * v + 1, tm + 1, tr, l, r);
    return min(v1, v2);
  }
};
int n, m, k, q;
vector<int> x1, sefsdcsdfv, x2, y2, ind, a1, a2;
vector<pair<int, int> > ls;
segment st;
bool c1(int i, int j) {
  if (x2[i] != x2[j]) {
    return x2[i] < x2[j];
  }
  if (x1[i] != x1[i]) {
    return x2[i] < x1[j];
  }
  return i < j;
}
bool d1(pair<int, int> i, pair<int, int> j) { return i.first < j.first; }
bool c2(int i, int j) {
  if (y2[i] != y2[j]) {
    return y2[i] < y2[j];
  }
  if (sefsdcsdfv[i] != sefsdcsdfv[j]) {
    return sefsdcsdfv[i] < sefsdcsdfv[j];
  }
  return i < j;
}
bool d2(pair<int, int> i, pair<int, int> j) { return i.second < j.second; }
inline void solve() {
  st = segment(m + 1);
  ind.assign(q, 0);
  iota((ind).begin(), (ind).end(), 0);
  sort((ind).begin(), (ind).end(), c1);
  sort((ls).begin(), (ls).end(), d1);
  a1.resize(q);
  int cl = 0, dl = 0;
  for (int i = 1; i <= n; i++) {
    while (dl < k && ls[dl].first <= i) {
      st.upd(ls[dl].second, i);
      ++dl;
    }
    while (cl < q && x2[ind[cl]] <= i) {
      int j = ind[cl];
      int cur = st.get(1, 0, st.n - 1, sefsdcsdfv[j], y2[j]);
      a1[j] = cur >= x1[j];
      ++cl;
    }
  }
  st = segment(n + 1);
  ind.assign(q, 0);
  iota((ind).begin(), (ind).end(), 0);
  sort((ind).begin(), (ind).end(), c2);
  sort((ls).begin(), (ls).end(), d2);
  a2.resize(q);
  cl = 0, dl = 0;
  for (int i = 1; i <= m; i++) {
    while (dl < k && ls[dl].second <= i) {
      st.upd(ls[dl].first, i);
      ++dl;
    }
    while (cl < q && y2[ind[cl]] <= i) {
      int j = ind[cl];
      int cur = st.get(1, 0, st.n - 1, x1[j], x2[j]);
      a2[j] = cur >= sefsdcsdfv[j];
      ++cl;
    }
  }
  for (int i = 0; i < q; i++) {
    cout << ((a1[i] || a2[i]) ? "YES" : "NO") << "\n";
  }
}
inline void read() {
  cin >> n >> m >> k >> q;
  ls.resize(k);
  for (int i = 0; i < k; i++) {
    cin >> ls[i].first >> ls[i].second;
  }
  x1.resize(q), sefsdcsdfv.resize(q), x2.resize(q), y2.resize(q);
  for (int i = 0; i < q; i++) {
    cin >> x1[i] >> sefsdcsdfv[i] >> x2[i] >> y2[i];
  }
}
