#include <bits/stdc++.h>
using namespace std;
const int NN = 201111, AA = 401111;
int n, m, K, Q, ww, ee, t[AA];
bool ans[NN];
struct point {
  int x, y;
  void swp() {
    int t = x;
    x = y;
    y = t;
  }
  friend bool operator<(point a, point b) { return a.x < b.x; }
} a[NN];
struct query {
  int x1, x2, y1, y2, id;
  void swp() {
    int t = x1;
    x1 = y1;
    y1 = t;
    t = x2;
    x2 = y2;
    y2 = t;
  }
  friend bool operator<(query a, query b) { return a.x2 < b.x2; }
} q[NN];
void build(int v, int l, int r) {
  t[v] = 0;
  if (r - l == 1) return;
  int mid = (l + r) >> 1;
  build(((v) << 1), l, mid);
  build(((v) << 1 | 1), mid, r);
}
void change(int v, int l, int r, int i, int x) {
  if (r - l == 1) {
    t[v] = x;
    return;
  }
  int mid = (l + r) >> 1;
  if (i < mid)
    change(((v) << 1), l, mid, i, x);
  else
    change(((v) << 1 | 1), mid, r, i, x);
  t[v] = min(t[((v) << 1)], t[((v) << 1 | 1)]);
}
int find(int v, int l, int r) {
  if (ww <= l && r <= ee) return t[v];
  int mid = (l + r) >> 1, res = 999999999;
  if (ww < mid) res = min(res, find(((v) << 1), l, mid));
  if (ee > mid) res = min(res, find(((v) << 1 | 1), mid, r));
  return res;
}
void work() {
  sort(a + 1, a + K + 1);
  sort(q + 1, q + Q + 1);
  build(1, 1, m + 1);
  for (int i = 1, now = 1; i <= Q; i++) {
    for (; now <= K && a[now].x <= q[i].x2; now++)
      change(1, 1, m + 1, a[now].y, a[now].x);
    ww = q[i].y1, ee = q[i].y2 + 1;
    if (find(1, 1, m + 1) >= q[i].x1) ans[q[i].id] = true;
  }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &K, &Q);
  int i;
  for (i = 1; i <= K; i++) scanf("%d%d", &a[i].x, &a[i].y);
  for (i = 1; i <= Q; i++) {
    scanf("%d%d%d%d", &q[i].x1, &q[i].y1, &q[i].x2, &q[i].y2);
    q[i].id = i;
  }
  work();
  for (i = 1; i <= K; i++) a[i].swp();
  for (i = 1; i <= Q; i++) q[i].swp();
  int t = n;
  n = m;
  m = t;
  work();
  for (i = 1; i <= Q; i++) printf(ans[i] ? "YES\n" : "NO\n");
  return 0;
}
