#include <bits/stdc++.h>
using namespace std;
vector<int> rx[100011];
vector<int> ry[100011];
struct st {
  int x1, y1, x2, y2, ind;
  st() {}
  st(int _x1, int _y1, int _x2, int _y2) {
    x1 = _x1;
    y1 = _y1;
    x2 = _x2;
    y2 = _y2;
  }
  st(int _x1, int _y1, int _x2, int _y2, int i) {
    x1 = _x1;
    y1 = _y1;
    x2 = _x2;
    y2 = _y2;
    ind = i;
  }
};
vector<st> qx[100011];
vector<st> qy[100011];
bool ans[200011];
int n, m;
int tree[400011];
void update(int node, int l, int r, int ind, int val) {
  if (l == r) {
    tree[node] = val;
    return;
  }
  int mid = (l + r) / 2;
  if (ind <= mid)
    update(2 * node, l, mid, ind, val);
  else
    update(2 * node + 1, mid + 1, r, ind, val);
  tree[node] = min(tree[2 * node], tree[2 * node + 1]);
}
bool query(int node, int l, int r, int second, int e, int bd) {
  if (second <= l and r <= e) {
    if (tree[node] >= bd) {
      return 1;
    }
    return 0;
  }
  if (e < l or second > r or second > e) return 1;
  int mid = (l + r) / 2;
  bool ret = 1;
  ret &= query(2 * node, l, mid, second, e, bd);
  ret &= query(2 * node + 1, mid + 1, r, second, e, bd);
  return ret;
}
void run() {
  for (int i = 0; i < 4 * m; i++) tree[i + 1] = 0;
  for (int i = 0; i < n; i++) {
    for (auto x : rx[i + 1]) {
      update(1, 1, m, x, i + 1);
    }
    for (auto q : qx[i + 1]) {
      if (query(1, 1, m, q.y1, q.y2, q.x1)) {
        ans[q.ind] = 1;
      }
    }
  }
  for (int i = 0; i < 4 * n; i++) tree[i + 1] = 0;
  for (int j = 0; j < m; j++) {
    for (auto y : ry[j + 1]) {
      update(1, 1, n, y, j + 1);
    }
    for (auto q : qy[j + 1]) {
      if (query(1, 1, n, q.x1, q.x2, q.y1)) {
        ans[q.ind] = 1;
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int k, qt, x1, y1, x2, y2;
  cin >> n >> m >> k >> qt;
  for (int i = 0; i < k; i++) {
    cin >> x1 >> y1;
    rx[x1].push_back(y1);
    ry[y1].push_back(x1);
  }
  vector<st> q;
  for (int i = 0; i < qt; i++) {
    cin >> x1 >> y1 >> x2 >> y2;
    q.push_back(st(x1, y1, x2, y2));
    qx[x2].push_back(st(x1, y1, x2, y2, i));
    qy[y2].push_back(st(x1, y1, x2, y2, i));
  }
  run();
  for (int i = 0; i < qt; i++) {
    if (ans[i]) {
      cout << "YES\n";
    } else {
      cout << "NO\n";
    }
  }
}
