#include <bits/stdc++.h>
using namespace std;
const int MN = 200111;
int n, m, k, q;
pair<int, int> rook[MN];
int it[MN * 8];
void update(int i, int l, int r, int u, int val) {
  if (u < l || r < u) return;
  if (l == r) {
    it[i] = val;
    return;
  }
  int mid = (l + r) >> 1;
  update(((i) << 1), l, mid, u, val);
  update((((i) << 1) + 1), mid + 1, r, u, val);
  it[i] = min(it[((i) << 1)], it[(((i) << 1) + 1)]);
}
int get(int i, int l, int r, int u, int v) {
  if (v < l || r < u) return MN;
  if (u <= l && r <= v) return it[i];
  int mid = (l + r) >> 1;
  return min(get(((i) << 1), l, mid, u, v),
             get((((i) << 1) + 1), mid + 1, r, u, v));
}
tuple<int, int, int, int> rect[MN];
int res[MN];
vector<int> updateAt[MN], queryAt[MN];
void solve1() {
  for (int i = (1), _b = (n); i <= _b; i++) {
    updateAt[i].clear();
    queryAt[i].clear();
  }
  for (int i = (1), _b = (k); i <= _b; i++) {
    updateAt[rook[i].second].push_back(rook[i].first);
  }
  for (int i = (1), _b = (q); i <= _b; i++) {
    queryAt[get<3>(rect[i])].push_back(i);
  }
  memset(it, 0, sizeof it);
  for (int i = (1), _b = (n); i <= _b; i++) {
    for (auto u : updateAt[i]) update(1, 1, m, u, i);
    for (auto id : queryAt[i]) {
      int l = get<0>(rect[id]);
      int r = get<2>(rect[id]);
      int nn = get(1, 1, n, l, r);
      if (nn >= get<1>(rect[id])) {
        res[id] = 1;
      }
    }
  }
}
void solve2() {
  for (int i = (1), _b = (m); i <= _b; i++) {
    updateAt[i].clear();
    queryAt[i].clear();
  }
  for (int i = (1), _b = (k); i <= _b; i++) {
    updateAt[rook[i].first].push_back(rook[i].second);
  }
  for (int i = (1), _b = (q); i <= _b; i++) {
    queryAt[get<2>(rect[i])].push_back(i);
  }
  memset(it, 0, sizeof it);
  for (int i = (1), _b = (n); i <= _b; i++) {
    for (auto u : updateAt[i]) update(1, 1, n, u, i);
    for (auto id : queryAt[i]) {
      int l = get<1>(rect[id]);
      int r = get<3>(rect[id]);
      int nn = get(1, 1, n, l, r);
      if (nn >= get<0>(rect[id])) {
        res[id] = 1;
      }
    }
  }
}
int main() {
  while (scanf("%d%d%d%d", &m, &n, &k, &q) == 4) {
    m = n = max(m, n);
    for (int i = (1), _b = (k); i <= _b; i++)
      scanf("%d%d", &rook[i].first, &rook[i].second);
    memset(res, 0, sizeof res);
    for (int i = (1), _b = (q); i <= _b; i++) {
      int x1, y1, x2, y2;
      scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
      rect[i] = make_tuple(x1, y1, x2, y2);
    }
    solve1();
    solve2();
    for (int i = (1), _b = (q); i <= _b; i++)
      if (res[i])
        puts("YES");
      else
        puts("NO");
  }
  return 0;
}
