#include <bits/stdc++.h>
using namespace std;
template <class T>
bool uax(T& a, const T& b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool uin(T& a, const T& b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
const int inf = 1e9 + 100500;
const int MAXN = 100500;
int a[MAXN];
pair<int, int> t[4 * MAXN];
pair<int, int> combine(pair<int, int> a, pair<int, int> b) {
  if (a.first > b.first) return a;
  if (b.first > a.first) return b;
  return make_pair(a.first, a.second + b.second);
}
void build(int a[], int v, int tl, int tr) {
  if (tl == tr)
    t[v] = make_pair(a[tl], 1);
  else {
    int tm = (tl + tr) / 2;
    build(a, v * 2, tl, tm);
    build(a, v * 2 + 1, tm + 1, tr);
    t[v] = combine(t[v * 2], t[v * 2 + 1]);
  }
}
pair<int, int> get_max(int v, int tl, int tr, int l, int r) {
  if (l > r) return make_pair(-inf, 0);
  if (l == tl && r == tr) return t[v];
  int tm = (tl + tr) / 2;
  return combine(get_max(v * 2, tl, tm, l, min(r, tm)),
                 get_max(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
}
void update(int v, int tl, int tr, int pos, int new_val) {
  if (tl == tr)
    t[v] = make_pair(new_val, 1);
  else {
    int tm = (tl + tr) / 2;
    if (pos <= tm)
      update(v * 2, tl, tm, pos, new_val);
    else
      update(v * 2 + 1, tm + 1, tr, pos, new_val);
    t[v] = combine(t[v * 2], t[v * 2 + 1]);
  }
}
struct event {
  bool type;
  int h;
  int id;
  bool operator<(const event& o) const {
    if (h != o.h) return h > o.h;
    if (type != o.type) return type < o.type;
    return id < o.id;
  }
} evq[MAXN * 4];
void solve() {
  int n, m;
  cin >> n >> m;
  int k, qn;
  cin >> k >> qn;
  vector<pair<int, int> > pt(k);
  for (int i = 0; i < (int)(k); ++i) {
    cin >> pt[i].first >> pt[i].second;
  }
  vector<pair<pair<int, int>, pair<int, int> > > q(qn);
  vector<bool> ans(qn, true);
  for (int i = 0; i < (int)(qn); ++i) {
    cin >> q[i].first.first >> q[i].second.first >> q[i].first.second >>
        q[i].second.second;
  }
  for (int it = 0; it < (int)(2); ++it) {
    for (int i = (int)(1); i <= (int)(n); ++i) a[i] = inf;
    build(a, 1, 1, n);
    do {
      ;
    } while (0);
    for (int i = 0; i < (int)(k); ++i) evq[i] = event({0, pt[i].second, i});
    for (int i = 0; i < (int)(qn); ++i)
      evq[i + k] = event({1, q[i].second.first, i});
    sort(evq, evq + k + qn);
    for (int _i = 0; _i < (int)(k + qn); ++_i) {
      event ev = evq[_i];
      if (ev.type) {
        int l = q[ev.id].first.first, r = q[ev.id].first.second;
        int vr = q[ev.id].second.second;
        int mmax = get_max(1, 1, n, l, r).first;
        do {
          ;
        } while (0);
        if (mmax <= vr) {
          ans[ev.id] = false;
        }
      } else {
        a[pt[ev.id].first] = pt[ev.id].second;
        update(1, 1, n, pt[ev.id].first, pt[ev.id].second);
        do {
          ;
        } while (0);
      }
    }
    do {
      ;
    } while (0);
    swap(n, m);
    for (int i = 0; i < (int)(k); ++i) swap(pt[i].first, pt[i].second);
    for (int i = 0; i < (int)(qn); ++i) swap(q[i].first, q[i].second);
  }
  for (int i = 0; i < (int)(qn); ++i) {
    cout << ((!ans[i]) ? "YES\n" : "NO\n");
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << fixed;
  cout.precision(15);
  cerr << fixed;
  cerr.precision(15);
  solve();
  return 0;
}
