#include <bits/stdc++.h>
using namespace std;
const int N = 200 * 1000 + 5;
int n, m, k, q;
int x[N], y[N];
pair<pair<int, int>, pair<int, int> > qr[N];
bool ans[N];
bool read() {
  if (scanf("%d %d %d %d", &n, &m, &k, &q) != 4) return false;
  for (int i = 0; i < int(k); ++i) {
    scanf("%d %d", &x[i], &y[i]);
    --x[i], --y[i];
  }
  for (int i = 0; i < int(q); ++i) {
    scanf("%d %d %d %d", &qr[i].first.first, &qr[i].first.second,
          &qr[i].second.first, &qr[i].second.second);
    --qr[i].first.first;
    --qr[i].first.second;
    --qr[i].second.first;
    --qr[i].second.second;
  }
  return true;
}
int st[4 * N];
vector<int> qs[N], ks[N];
void update(int v, int l, int r, int key, int value) {
  if (l == r) {
    assert(l == key);
    st[v] = value;
    return;
  }
  int m = (l + r) >> 1;
  if (key <= m)
    update(v * 2 + 1, l, m, key, value);
  else
    update(v * 2 + 2, m + 1, r, key, value);
  st[v] = min(st[v * 2 + 1], st[v * 2 + 2]);
}
int get(int v, int l, int r, int L, int R) {
  if (l == L && r == R) return st[v];
  int m = (l + r) >> 1;
  if (R <= m) return get(v * 2 + 1, l, m, L, R);
  if (L > m) return get(v * 2 + 2, m + 1, r, L, R);
  return min(get(v * 2 + 1, l, m, L, m), get(v * 2 + 2, m + 1, r, m + 1, R));
}
void do_solve() {
  memset(st, -1, sizeof st);
  for (int i = 0; i < int(m); ++i) qs[i].clear();
  for (int i = 0; i < int(q); ++i) qs[qr[i].second.second].push_back(i);
  for (int i = 0; i < int(m); ++i) ks[i].clear();
  for (int i = 0; i < int(k); ++i) ks[y[i]].push_back(i);
  for (int y = 0; y < int(m); ++y) {
    for (int j = 0; j < int(int(ks[y].size())); ++j) {
      int i = ks[y][j];
      update(0, 0, n - 1, x[i], y);
    }
    for (int j = 0; j < int(int(qs[y].size())); ++j) {
      int i = qs[y][j];
      ans[i] |= get(0, 0, n - 1, qr[i].first.first, qr[i].second.first) >=
                qr[i].first.second;
    }
  }
}
void solve() {
  memset(ans, 0, sizeof ans);
  do_solve();
  swap(n, m);
  for (int i = 0; i < int(k); ++i) swap(x[i], y[i]);
  for (int i = 0; i < int(q); ++i) {
    swap(qr[i].first.first, qr[i].first.second);
    swap(qr[i].second.first, qr[i].second.second);
  }
  do_solve();
  for (int i = 0; i < int(q); ++i) puts(ans[i] ? "YES" : "NO");
}
int main() {
  while (read()) solve();
  return 0;
}
