#include <bits/stdc++.h>
using namespace std;
const int N = 210000;
int n, m, r, q, x[N], y[N], cx1[N], cx2[N], cy1[N], cy2[N], rez[N], p[N];
vector<int> poz[2 * N];
vector<pair<int, int> > el[2 * N];
int nrel[N];
void update(int nod, int pozx, int pozy, int p1, int p2) {
  el[nod].push_back(pair<int, int>(p2, p1));
  if (pozx == pozy) return;
  int mid = (pozx + pozy) / 2;
  if (mid >= p1)
    update(2 * nod, pozx, mid, p1, p2);
  else
    update(2 * nod + 1, mid + 1, pozy, p1, p2);
}
void calcpoz(int nod, int pozx, int pozy) {
  poz[nod].resize(el[nod].size());
  int i, j = 0, nrdif = 0;
  for (i = pozx; i <= pozy; ++i) nrel[i] = 0;
  for (i = 0; i < el[nod].size(); ++i) {
    poz[nod][i] = el[nod].size();
    while (j < el[nod].size() && nrdif != (pozy - pozx + 1)) {
      ++nrel[el[nod][j].second];
      if (nrel[el[nod][j].second] == 1) ++nrdif;
      ++j;
    }
    if (nrdif == (pozy - pozx + 1)) poz[nod][i] = j - 1;
    --nrel[el[nod][i].second];
    if (!nrel[el[nod][i].second]) --nrdif;
  }
  if (pozx == pozy) return;
  int mid = (pozx + pozy) / 2;
  calcpoz(2 * nod, pozx, mid);
  calcpoz(2 * nod + 1, mid + 1, pozy);
}
int query(int nod, int pozx, int pozy, int p1, int p2, int cs1, int cs2) {
  if (pozx >= p1 && p2 >= pozy) {
    int z1 = lower_bound(el[nod].begin(), el[nod].end(),
                         pair<int, int>(cs1, 0)) -
             el[nod].begin(),
        z2 = lower_bound(el[nod].begin(), el[nod].end(),
                         pair<int, int>(cs2 + 1, 0)) -
             el[nod].begin() - 1;
    if (z1 == el[nod].size()) return 0;
    if (poz[nod][z1] > z2) return 0;
    return 1;
  }
  int mid = (pozx + pozy) / 2, r = 1;
  if (mid >= p1) r = query(2 * nod, pozx, mid, p1, p2, cs1, cs2);
  if (mid < p2) r = min(r, query(2 * nod + 1, mid + 1, pozy, p1, p2, cs1, cs2));
  return r;
}
bool cmp(int a, int b) { return y[a] < y[b]; }
void sol() {
  int i;
  for (i = 0; i < 2 * N; ++i) {
    el[i].clear();
    poz[i].clear();
  }
  for (i = 1; i <= r; ++i) p[i] = i;
  sort(p + 1, p + r + 1, cmp);
  for (i = 1; i <= r; ++i) update(1, 1, n, x[p[i]], y[p[i]]);
  calcpoz(1, 1, n);
  for (i = 1; i <= q; ++i)
    if (query(1, 1, n, cx1[i], cx2[i], cy1[i], cy2[i])) rez[i] = 1;
}
int main() {
  int i;
  cin >> n >> m >> r >> q;
  for (i = 1; i <= r; ++i) scanf("%d%d", &x[i], &y[i]);
  for (i = 1; i <= q; ++i)
    scanf("%d%d%d%d", &cx1[i], &cy1[i], &cx2[i], &cy2[i]);
  sol();
  for (i = 1; i <= r; ++i) swap(x[i], y[i]);
  for (i = 1; i <= q; ++i) {
    swap(cx1[i], cy1[i]);
    swap(cx2[i], cy2[i]);
  }
  swap(n, m);
  sol();
  for (i = 1; i <= q; ++i) {
    if (rez[i])
      cout << "YES\n";
    else
      cout << "NO\n";
  }
  return 0;
}
