#include <bits/stdc++.h>
using namespace std;
int n, m, k, q;
const int MAXN = (1 << 17) + 10;
const int NN = (1 << 17) - 1;
int rt[2 * MAXN], ct[2 * MAXN];
vector<pair<int, int> > rowrook, colrook;
vector<pair<pair<pair<int, int>, pair<int, int> >, int> > rowquery, colquery;
const int MAXQ = 200010;
int res[MAXQ];
int main() {
  scanf("%d%d%d%d", &n, &m, &k, &q);
  int x, y;
  for (int i = 0; i < (int)(k); i++) {
    scanf("%d%d", &x, &y);
    rowrook.push_back(make_pair(x, y));
    colrook.push_back(make_pair(y, x));
  }
  sort(rowrook.begin(), rowrook.end());
  sort(colrook.begin(), colrook.end());
  int x1, y1, x2, y2;
  for (int i = 0; i < (int)(q); i++) {
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    colquery.push_back(
        make_pair(make_pair(make_pair(y2, y1), make_pair(x1, x2)), i + 1));
    rowquery.push_back(
        make_pair(make_pair(make_pair(x2, x1), make_pair(y1, y2)), i + 1));
  }
  sort(rowquery.begin(), rowquery.end());
  sort(colquery.begin(), colquery.end());
  memset(res, 0, sizeof res);
  memset(rt, -1, sizeof rt);
  int rookidx = 0;
  int queryidx = 0;
  for (int j = 1; j <= (int)(m); j++) {
    while (rookidx < k && colrook[rookidx].first == j) {
      int r = colrook[rookidx].second;
      rt[NN + r] = j;
      for (int node = (NN + r) / 2; node; node /= 2)
        rt[node] = min(rt[2 * node], rt[2 * node + 1]);
      rookidx++;
    }
    while (queryidx < q && colquery[queryidx].first.first.first == j) {
      int ln = NN + colquery[queryidx].first.second.first;
      int rn = NN + colquery[queryidx].first.second.second;
      int mm = 2000000000;
      while (ln <= rn) {
        if ((ln & 1)) mm = min(mm, rt[ln]);
        if (!(rn & 1)) mm = min(mm, rt[rn]);
        ln = (ln + 1) / 2;
        rn = (rn - 1) / 2;
      }
      if (mm >= colquery[queryidx].first.first.second)
        res[colquery[queryidx].second] = 1;
      queryidx++;
    }
    if (j == m && (rookidx != k || queryidx != q))
      cout << rookidx << " " << queryidx << endl;
  }
  memset(ct, -1, sizeof ct);
  rookidx = 0;
  queryidx = 0;
  for (int i = 1; i <= (int)(n); i++) {
    while (rookidx < k && rowrook[rookidx].first == i) {
      int c = rowrook[rookidx].second;
      ct[NN + c] = i;
      for (int node = (NN + c) / 2; node; node /= 2)
        ct[node] = min(ct[2 * node], ct[2 * node + 1]);
      rookidx++;
    }
    while (queryidx < q && rowquery[queryidx].first.first.first == i) {
      int ln = NN + rowquery[queryidx].first.second.first;
      int rn = NN + rowquery[queryidx].first.second.second;
      int mm = 2000000000;
      while (ln <= rn) {
        if ((ln & 1)) mm = min(mm, ct[ln]);
        if (!(rn & 1)) mm = min(mm, ct[rn]);
        ln = (ln + 1) / 2;
        rn = (rn - 1) / 2;
      }
      if (mm >= rowquery[queryidx].first.first.second)
        res[rowquery[queryidx].second] = 1;
      queryidx++;
    }
    if (i == n && (rookidx != k || queryidx != q))
      cout << rookidx << " " << queryidx << endl;
  }
  for (int i = 1; i <= (int)(q); i++) {
    if (res[i])
      printf("YES\n");
    else
      printf("NO\n");
  }
  return 0;
}
