#include <bits/stdc++.h>
using namespace std;
vector<int> v[200005], h[200005];
vector<int> qv[200005], qh[200005];
int ans[200005], last[4 * 200005];
int x[2][200005], y[2][200005];
void push_up(int rt) { last[rt] = min(last[rt << 1], last[rt << 1 | 1]); }
void update(int l, int r, int rt, int p, int x) {
  if (l == r) {
    last[rt] = max(last[rt], x);
    return;
  }
  int mid = (l + r) >> 1;
  if (p <= mid)
    update(l, mid, rt << 1, p, x);
  else
    update(mid + 1, r, rt << 1 | 1, p, x);
  push_up(rt);
}
int query(int l, int r, int rt, int L, int R) {
  if (L <= l && R >= r) return last[rt];
  int mid = (l + r) >> 1;
  int ret = 1000000007;
  if (L <= mid) ret = min(ret, query(l, mid, rt << 1, L, min(mid, R)));
  if (R > mid)
    ret = min(ret, query(mid + 1, r, rt << 1 | 1, max(mid + 1, L), R));
  return ret;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, m, k, q;
  while (cin >> n >> m >> k >> q) {
    for (int i = (1); i <= (n); i++) v[i].clear();
    for (int i = (1); i <= (m); i++) h[i].clear();
    for (int i = (1); i <= (k); i++) {
      int x, y;
      cin >> x >> y;
      v[x].push_back(y);
      h[y].push_back(x);
    }
    for (int i = (1); i <= (q); i++) {
      cin >> x[0][i] >> y[0][i] >> x[1][i] >> y[1][i];
      qv[x[1][i]].push_back(i);
      qh[y[1][i]].push_back(i);
    }
    memset(ans, 0, sizeof(ans));
    memset(last, 0, sizeof(last));
    for (int i = (1); i <= (m); i++) {
      for (auto u : h[i]) update(1, n, 1, u, i);
      for (auto qu : qh[i]) {
        if (query(1, n, 1, x[0][qu], x[1][qu]) >= y[0][qu]) ans[qu] = 1;
      }
    }
    memset(last, 0, sizeof(last));
    for (int i = (1); i <= (n); i++) {
      for (auto u : v[i]) update(1, m, 1, u, i);
      for (auto qu : qv[i]) {
        if (query(1, m, 1, y[0][qu], y[1][qu]) >= x[0][qu]) ans[qu] = 1;
      }
    }
    for (int i = (1); i <= (q); i++) {
      if (ans[i] == 0)
        cout << "NO" << endl;
      else
        cout << "YES" << endl;
    }
  }
  return 0;
}
