#include <bits/stdc++.h>
using namespace std;
struct query {
  int x1, y1, x2, y2, i;
  bool operator<(const query q) const { return x2 < q.x2; }
};
const int MAXK = 200005;
const int SZ = 1 << 18;
int N, M, K, Q, A[2 * SZ], res[MAXK];
pair<int, int> R[MAXK];
query queries[MAXK];
void update(int p, int v) {
  p += SZ - 1;
  A[p] = v;
  for (p /= 2; p; p /= 2) {
    A[p] = min(A[2 * p], A[2 * p + 1]);
  }
}
int rmq(int l, int r) {
  l += SZ - 1, r += SZ;
  int res = MAXK;
  for (; l < r; l /= 2, r /= 2) {
    if (l & 1) res = min(res, A[l++]);
    if (r & 1) res = min(res, A[--r]);
  }
  return res;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> N >> M >> K >> Q;
  for (int i = 0; i < K; i++) {
    int x, y;
    cin >> x >> y;
    R[i] = pair<int, int>(x, y);
  }
  for (int i = 0; i < Q; i++) {
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    queries[i] = {x1, y1, x2, y2, i};
  }
  sort(R, R + K);
  sort(queries, queries + Q);
  for (int i = 0, j = 0; i < Q; i++) {
    for (; j < K && R[j].first <= queries[i].x2; j++) {
      update(R[j].second, R[j].first);
    }
    int r = rmq(queries[i].y1, queries[i].y2);
    if (r >= queries[i].x1) res[queries[i].i] = 1;
  }
  for (int i = 0; i < K; i++) {
    swap(R[i].first, R[i].second);
  }
  for (int i = 0; i < Q; i++) {
    swap(queries[i].x1, queries[i].y1);
    swap(queries[i].x2, queries[i].y2);
  }
  memset(A, 0, sizeof(A));
  sort(R, R + K);
  sort(queries, queries + Q);
  for (int i = 0, j = 0; i < Q; i++) {
    for (; j < K && R[j].first <= queries[i].x2; j++) {
      update(R[j].second, R[j].first);
    }
    int r = rmq(queries[i].y1, queries[i].y2);
    if (r >= queries[i].x1) res[queries[i].i] = 1;
  }
  for (int i = 0; i < Q; i++) {
    cout << (res[i] ? "YES\n" : "NO\n");
  }
}
