#include <bits/stdc++.h>
using namespace std;
const int inf = ~0U >> 1;
const long long INF = ~0ULL >> 1;
const int maxn = 250000;
struct node {
  int l, r, m;
} t[120000 * 4];
int X1[maxn], Y1[maxn], X2[maxn], Y2[maxn], x[maxn], y[maxn];
int N, M, K, Q, ans[maxn];
vector<int> E[maxn], q[maxn];
void modify(int p, int dest, int d) {
  if (t[p].l == t[p].r) {
    t[p].m = min(t[p].m, d);
    return;
  }
  int m = t[p].l + t[p].r >> 1;
  if (dest <= m)
    modify(p << 1, dest, d);
  else
    modify(p << 1 | 1, dest, d);
  t[p].m = max(t[p << 1].m, t[p << 1 | 1].m);
}
int query(int p, int l, int r) {
  if (t[p].l == l && t[p].r == r) return t[p].m;
  int m = t[p].l + t[p].r >> 1;
  if (r <= m)
    return query(p << 1, l, r);
  else if (l > m)
    return query(p << 1 | 1, l, r);
  else
    return max(query(p << 1, l, m), query(p << 1 | 1, m + 1, r));
}
void build(int p, int l, int r) {
  t[p].l = l;
  t[p].r = r;
  if (l != r) {
    build(p << 1, l, l + r >> 1);
    build(p << 1 | 1, (l + r >> 1) + 1, r);
  }
  t[p].m = inf;
}
void solve() {
  build(1, 1, M);
  for (int i = (1); i <= (N); ++i) E[i].clear(), q[i].clear();
  for (int i = (1); i <= (K); ++i) E[x[i]].push_back(y[i]);
  for (int i = (1); i <= (Q); ++i) q[X1[i]].push_back(i);
  for (int i = (N); i >= (1); --i) {
    for (auto v : E[i]) modify(1, v, i);
    for (auto v : q[i]) {
      int t = query(1, Y1[v], Y2[v]);
      if (t <= X2[v]) ans[v] = 1;
    }
  }
}
int main() {
  scanf("%d%d%d%d", &N, &M, &K, &Q);
  for (int i = (1); i <= (K); ++i) scanf("%d%d", &x[i], &y[i]);
  for (int i = (1); i <= (Q); ++i)
    scanf("%d%d%d%d", &X1[i], &Y1[i], &X2[i], &Y2[i]);
  solve();
  for (int i = (1); i <= (K); ++i) swap(x[i], y[i]);
  for (int i = (1); i <= (Q); ++i) swap(X1[i], Y1[i]), swap(X2[i], Y2[i]);
  swap(N, M);
  solve();
  for (int i = (1); i <= (Q); ++i) puts(ans[i] ? "YES" : "NO");
  return 0;
}
