#include <bits/stdc++.h>
static inline unsigned long long rdtsc() {
  unsigned long long d;
  __asm__ __volatile__("rdtsc" : "=A"(d));
  return d;
}
using namespace std;
const int inf = (int)1e9;
const double eps = 1e-9;
const int maxn = (int)2e5 + 10;
const int N = 1 << 18;
struct tree {
  int t[2 * N];
  tree() { memset(t, 0, sizeof t); }
  void clear() { memset(t, 0, sizeof t); }
  inline int get(int l, int r) {
    l += N;
    r += N;
    int res = inf;
    while (l <= r) {
      if ((l & 1) == 1) res = min(res, t[l]);
      if ((r & 1) == 0) res = min(res, t[r]);
      l = (l + 1) >> 1;
      r = (r - 1) >> 1;
    }
    return res;
  }
  inline void upd(int x, int val) {
    x += N;
    t[x] = val;
    while (x > 1) {
      x >>= 1;
      t[x] = min(t[2 * x], t[2 * x + 1]);
    }
  }
};
int x[maxn], y[maxn];
int x1[maxn], sdfkljh[maxn], x2[maxn], y2[maxn];
int res[maxn];
tree t;
pair<int, int> e[maxn * 2];
int ec = 0;
int main() {
  int n, m, k, q;
  scanf("%d%d%d%d", &n, &m, &k, &q);
  for (int i = 0; (i) < (k); ++i) scanf("%d%d", &x[i], &y[i]);
  for (int i = 0; (i) < (q); ++i)
    scanf("%d%d%d%d", &x1[i], &sdfkljh[i], &x2[i], &y2[i]);
  for (int _ = 0; (_) < (2); ++_) {
    t.clear();
    ec = 0;
    for (int i = 0; (i) < (k); ++i) e[ec++] = make_pair(y[i], -i - 1);
    for (int i = 0; (i) < (q); ++i) e[ec++] = make_pair(y2[i], i + 1);
    sort(e, e + ec);
    for (int i = 0; (i) < (ec); ++i) {
      int id = e[i].second;
      if (id > 0) {
        id -= 1;
        if (t.get(x1[id], x2[id]) >= sdfkljh[id]) {
          res[id] = 1;
        }
      } else {
        id = -id - 1;
        t.upd(x[id], y[id]);
      }
    }
    for (int i = 0; (i) < (k); ++i) swap(x[i], y[i]);
    for (int i = 0; (i) < (q); ++i) {
      swap(x1[i], sdfkljh[i]);
      swap(x2[i], y2[i]);
    }
  }
  for (int i = 0; (i) < (q); ++i) {
    if (res[i])
      printf("YES\n");
    else
      printf("NO\n");
  }
  return 0;
}
