#include <bits/stdc++.h>
using namespace std;
const int N = 220000;
const long long P = 1000000007;
int n, m, k, q;
int ans[N];
pair<int, int> a[N];
struct ele {
  int x, y, xx, yy, I;
} b[N];
int tr[N * 2];
void cl(int l, int r, int x) {
  if (l + 1 < r) {
    cl(l, (l + r) / 2, x * 2);
    cl((l + r) / 2, r, x * 2 + 1);
  }
  tr[x] = 0;
}
void add(int l, int r, int x, int ind, int mn) {
  if (l + 1 == r) {
    tr[x] = mn;
    return;
  }
  if ((l + r) / 2 <= ind)
    add((l + r) / 2, r, x * 2 + 1, ind, mn);
  else
    add(l, (l + r) / 2, x * 2, ind, mn);
  tr[x] = ((tr[x * 2]) < (tr[x * 2 + 1]) ? (tr[x * 2]) : (tr[x * 2 + 1]));
}
int cal(int l, int r, int x, int ll, int rr) {
  if (l > rr || r - 1 < ll) return N;
  if (ll <= l && r - 1 <= rr) return tr[x];
  return min(cal(l, (l + r) / 2, x * 2, ll, rr),
             cal((l + r) / 2, r, x * 2 + 1, ll, rr));
}
bool boo(ele A, ele B) { return A.xx < B.xx; }
void sol() {
  sort(a + 1, a + k + 1);
  cl(1, m + 1, 1);
  sort(b + 1, b + q + 1, boo);
  int I = 1;
  for (int i = 1; i <= q; i++) {
    while (I <= k && a[I].first <= b[i].xx) {
      add(1, m + 1, 1, a[I].second, a[I].first);
      I++;
    }
    ans[b[i].I] += (cal(1, m + 1, 1, b[i].y, b[i].yy) >= b[i].x);
  }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &k, &q);
  for (int i = 1; i <= k; i++) scanf("%d%d", &a[i].first, &a[i].second);
  for (int i = 1; i <= q; i++)
    scanf("%d%d%d%d", &b[i].x, &b[i].y, &b[i].xx, &b[i].yy), b[i].I = i;
  m = ((n) > (m) ? (n) : (m));
  sol();
  for (int i = 1; i <= q; i++) swap(b[i].x, b[i].y), swap(b[i].xx, b[i].yy);
  for (int i = 1; i <= k; i++) swap(a[i].first, a[i].second);
  sol();
  for (int i = 1; i <= q; i++) printf(ans[i] > 0 ? "YES\n" : "NO\n");
  return 0;
}
