#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
vector<int> xx[N], yy[N], v[N], u[N];
int x1[N], x2[N], y2[N], y[N];
int ret[N], tree[N * 2], c, L, R;
void update(int pos, int l, int r, int v) {
  if (c < l || r < c) return;
  if (l == r && l == c) {
    tree[pos] = v;
    return;
  }
  int mid = (l + r) / 2;
  update(pos << 1, l, mid, v);
  update(pos << 1 | 1, mid + 1, r, v);
  tree[pos] = min(tree[pos << 1], tree[pos << 1 | 1]);
}
int qq(int pos, int l, int r) {
  if (r < L || R < l) return 1e9;
  int mid = (l + r) / 2;
  if (L <= l && r <= R) return tree[pos];
  return min(qq(pos << 1, l, mid), qq(pos << 1 | 1, mid + 1, r));
}
int main() {
  ios::sync_with_stdio(false);
  int n, m, k, q, i, j, a, b, x;
  scanf("%d%d%d%d", &n, &m, &k, &q);
  for (i = 0; i < k; ++i) {
    scanf("%d%d", &a, &b);
    xx[a].push_back(b);
    yy[b].push_back(a);
  }
  for (i = 0; i < q; ++i) {
    scanf("%d%d%d%d", &x1[i], &y[i], &x2[i], &y2[i]);
    u[x2[i]].push_back(i);
    v[y2[i]].push_back(i);
  }
  for (i = 1; i <= n; ++i) {
    for (j = 0; j < xx[i].size(); ++j) c = xx[i][j], update(1, 1, m, i);
    for (j = 0; j < u[i].size(); ++j) {
      x = u[i][j];
      L = y[x], R = y2[x];
      if (qq(1, 1, m) >= x1[x]) ret[x] |= 1;
    }
  }
  memset(tree, 0, sizeof(tree));
  for (i = 1; i <= m; ++i) {
    for (j = 0; j < yy[i].size(); ++j) c = yy[i][j], update(1, 1, n, i);
    for (j = 0; j < v[i].size(); ++j) {
      x = v[i][j];
      L = x1[x], R = x2[x];
      if (qq(1, 1, n) >= y[x]) ret[x] |= 1;
    }
  }
  for (i = 0; i < q; ++i)
    if (ret[i])
      printf("YES\n");
    else
      printf("NO\n");
}
