#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
struct pi {
  int le, ri, min;
} pp[maxn << 2];
struct ppi {
  int x, y, x1, y1;
} pp1[maxn], pp2[maxn];
vector<int> g[maxn], g1[maxn];
int vis[maxn];
void init(int tot, int l, int r) {
  pp[tot].le = l;
  pp[tot].ri = r;
  pp[tot].min = -100000000;
  if (l == r) return;
  init(2 * tot, l, (l + r) / 2);
  init(2 * tot + 1, (l + r) / 2 + 1, r);
}
void merg(int tot, int p, int x) {
  if (pp[tot].le == pp[tot].ri) {
    pp[tot].min = x;
    return;
  }
  int mid = (pp[tot].le + pp[tot].ri) / 2;
  if (p <= mid)
    merg(2 * tot, p, x);
  else
    merg(2 * tot + 1, p, x);
  pp[tot].min = min(pp[2 * tot].min, pp[2 * tot + 1].min);
}
int query(int tot, int l, int r) {
  if (pp[tot].le >= l && pp[tot].ri <= r) return pp[tot].min;
  int mid = (pp[tot].le + pp[tot].ri) / 2;
  if (l <= mid && r > mid) {
    return min(query(2 * tot, l, r), query(2 * tot + 1, l, r));
  } else if (l <= mid && r <= mid)
    return query(2 * tot, l, r);
  else if (l > mid && r > mid)
    return query(2 * tot + 1, l, r);
  return -100000000;
}
int main() {
  int i, j, n, m, k, q;
  cin >> n >> m >> k >> q;
  for (i = 1; i <= k; i++) {
    scanf("%d%d", &pp2[i].x, &pp2[i].y);
    g1[pp2[i].x].push_back(i);
  }
  for (i = 1; i <= q; i++) {
    scanf("%d%d%d%d", &pp1[i].x, &pp1[i].y, &pp1[i].x1, &pp1[i].y1);
    g[pp1[i].x1].push_back(i);
  }
  init(1, 1, m);
  for (i = 1; i <= n; i++) {
    int p = g1[i].size();
    for (j = 0; j < p; j++) {
      merg(1, pp2[g1[i][j]].y, i);
    }
    p = g[i].size();
    for (j = 0; j < p; j++) {
      if (query(1, pp1[g[i][j]].y, pp1[g[i][j]].y1) >= pp1[g[i][j]].x) {
        vis[g[i][j]] = 1;
      }
    }
  }
  for (i = 1; i <= n; i++) {
    g1[i].clear();
    g[i].clear();
  }
  for (i = 1; i <= k; i++) {
    g1[pp2[i].y].push_back(i);
  }
  for (i = 1; i <= q; i++) {
    g[pp1[i].y1].push_back(i);
  }
  init(1, 1, n);
  for (i = 1; i <= m; i++) {
    int p = g1[i].size();
    for (j = 0; j < p; j++) {
      merg(1, pp2[g1[i][j]].x, i);
    }
    p = g[i].size();
    for (j = 0; j < p; j++) {
      if (query(1, pp1[g[i][j]].x, pp1[g[i][j]].x1) >= pp1[g[i][j]].y) {
        vis[g[i][j]] = 1;
      }
    }
  }
  for (i = 1; i <= q; i++) {
    if (vis[i])
      printf("YES\n");
    else
      printf("NO\n");
  }
}
