#include <bits/stdc++.h>
using namespace std;
int ri() {
  int x;
  scanf("%d", &x);
  return x;
}
const int N = 100000, NN = 131072, K = 200000, Q = 200000;
struct P {
  int x, y, xx, yy, id;
  bool operator<(const P &o) const { return yy < o.yy; }
};
bool ans[Q];
P a[Q];
pair<int, int> b[K];
int seg[NN * 2];
void upd_min(int x, int v) {
  seg[x += NN - 1] = v;
  while (x) {
    x = (x - 1) / 2;
    seg[x] = min(seg[x * 2 + 1], seg[x * 2 + 2]);
  }
}
int get_min(int l, int r) {
  int ans = NN;
  l += NN - 1;
  r += NN - 1;
  for (; l < r; l /= 2, r /= 2) {
    if (l % 2 == 0) ans = min(ans, seg[l++]);
    if (r % 2 == 0) ans = min(ans, seg[--r]);
  }
  return ans;
}
void f(int k, int q) {
  fill_n(seg, 2 * NN, -1);
  sort(a, a + q);
  sort(b, b + k);
  int j = 0;
  for (int i = (0); i < (q); i++) {
    for (; j < k && b[j].first <= a[i].yy; j++)
      upd_min(b[j].second, b[j].first);
    if (get_min(a[i].x, a[i].xx + 1) >= a[i].y) ans[a[i].id] = true;
  }
}
int main() {
  ri();
  ri();
  int k = ri(), q = ri();
  for (int i = (0); i < (k); i++) {
    b[i].second = ri() - 1;
    b[i].first = ri() - 1;
  }
  for (int i = (0); i < (q); i++) {
    a[i].x = ri() - 1;
    a[i].y = ri() - 1;
    a[i].xx = ri() - 1;
    a[i].yy = ri() - 1;
    a[i].id = i;
  }
  f(k, q);
  for (int i = (0); i < (k); i++) swap(b[i].first, b[i].second);
  for (int i = (0); i < (q); i++) {
    swap(a[i].x, a[i].y);
    swap(a[i].xx, a[i].yy);
  }
  f(k, q);
  for (int i = (0); i < (q); i++) puts(ans[i] ? "YES" : "NO");
}
