#include <bits/stdc++.h>
using namespace std;
struct REC {
  int x1, x2, y1, y2, id;
} rec[200000 + 5];
bool cmprx(REC a, REC b) { return a.x2 < b.x2; }
bool cmpry(REC a, REC b) { return a.y2 < b.y2; }
pair<int, int> chess[200000 + 5];
bool cmpcx(pair<int, int> a, pair<int, int> b) { return a.first < b.first; }
bool cmpcy(pair<int, int> a, pair<int, int> b) { return a.second < b.second; }
bool ans[200000 + 5];
struct SEG {
  int a[200000 * 4 + 5];
  void pu(int i) { a[i] = min(a[i * 2], a[i * 2 + 1]); }
  void build(int i, int l, int r) {
    a[i] = -0x3f3f3f3f;
    if (l != r) {
      int mid = (l + r) >> 1;
      build(i * 2, l, mid);
      build(i * 2 + 1, mid + 1, r);
    }
  }
  void change(int i, int l, int r, int pos, int x) {
    if (pos <= l && r <= pos) {
      a[i] = x;
      return;
    }
    if (pos < l || r < pos) return;
    int mid = (l + r) >> 1;
    change(i * 2, l, mid, pos, x);
    change(i * 2 + 1, mid + 1, r, pos, x);
    pu(i);
  }
  int ask(int i, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr) return a[i];
    if (qr < l || r < ql) return 0x3f3f3f3f;
    int mid = (l + r) >> 1;
    return min(ask(i * 2, l, mid, ql, qr), ask(i * 2 + 1, mid + 1, r, ql, qr));
  }
} st;
int main() {
  int n, m, k, q;
  scanf("%d%d%d%d", &n, &m, &k, &q);
  for (int i = 1; i <= k; i++) scanf("%d%d", &chess[i].first, &chess[i].second);
  for (int i = 1; i <= q; i++)
    scanf("%d%d%d%d", &rec[i].x1, &rec[i].y1, &rec[i].x2, &rec[i].y2),
        rec[i].id = i;
  sort(rec + 1, rec + q + 1, cmpry);
  sort(chess + 1, chess + k + 1, cmpcy);
  st.build(1, 1, n);
  int ptr = 1;
  for (int i = 1; i <= q; i++) {
    while (ptr <= k && chess[ptr].second <= rec[i].y2) {
      st.change(1, 1, n, chess[ptr].first, chess[ptr].second);
      ptr++;
    }
    if (st.ask(1, 1, n, rec[i].x1, rec[i].x2) >= rec[i].y1) ans[rec[i].id] = 1;
  }
  sort(rec + 1, rec + q + 1, cmprx);
  sort(chess + 1, chess + k + 1, cmpcx);
  st.build(1, 1, m);
  ptr = 1;
  for (int i = 1; i <= q; i++) {
    while (ptr <= k && chess[ptr].first <= rec[i].x2) {
      st.change(1, 1, m, chess[ptr].second, chess[ptr].first);
      ptr++;
    }
    if (st.ask(1, 1, m, rec[i].y1, rec[i].y2) >= rec[i].x1) ans[rec[i].id] = 1;
  }
  for (int i = 1; i <= q; i++) printf("%s\n", ans[i] ? "YES" : "NO");
  return 0;
}
