#include <bits/stdc++.h>
using namespace std;
int n, m, k, Q, ans[100100 << 1];
pair<int, int> p[100100 << 1];
struct query {
  int id;
  pair<int, int> x, y;
  bool operator<(const query &q) const { return y.first < q.y.first; }
  void in(int i) {
    scanf("%d %d %d %d", &x.first, &x.second, &y.first, &y.second);
    id = i;
  }
} q[100100 << 1];
int val[100100], mn[100100 << 2];
void modify(int v, int vl, int vr, int p) {
  if (vl == vr)
    mn[v] = val[p];
  else {
    int mi = vl + vr >> 1;
    if (p <= mi)
      modify(v << 1, vl, mi, p);
    else
      modify(v << 1 | 1, mi + 1, vr, p);
    mn[v] = min(mn[v << 1], mn[v << 1 | 1]);
  }
}
int query(int v, int vl, int vr, int l, int r) {
  if (vl > r || l > vr) return 1e9;
  if (l <= vl && vr <= r) return mn[v];
  int mi = vl + vr >> 1;
  return min(query(v << 1, vl, mi, l, r), query(v << 1 | 1, mi + 1, vr, l, r));
}
void solve() {
  sort(q, q + Q);
  sort(p, p + k);
  for (int i = 1; i <= m; i++) val[i] = 0;
  for (int i = 1; i <= (m << 2); i++) mn[i] = 0;
  for (int i = 0, j = 0; i < Q; i++) {
    while (j < k && p[j].first <= q[i].y.first) {
      val[p[j].second] = p[j].first;
      modify(1, 1, m, p[j].second);
      j++;
    }
    if (query(1, 1, m, q[i].x.second, q[i].y.second) >= q[i].x.first)
      ans[q[i].id] = 1;
  }
}
int main() {
  scanf("%d %d %d %d", &n, &m, &k, &Q);
  for (int i = 0; i < k; i++) scanf("%d %d", &p[i].first, &p[i].second);
  for (int i = 0; i < Q; i++) q[i].in(i);
  solve();
  for (int i = 0; i < k; i++) swap(p[i].first, p[i].second);
  swap(n, m);
  for (int i = 0; i < Q; i++)
    swap(q[i].x.first, q[i].x.second), swap(q[i].y.first, q[i].y.second);
  solve();
  for (int i = 0; i < Q; i++) puts(ans[i] ? "YES" : "NO");
  return 0;
}
