#include <bits/stdc++.h>
using namespace std;
struct Rook {
  int r, c;
};
struct Rect {
  int r1, c1, r2, c2, i;
};
bool operator<(const Rook& a, const Rook& b) { return a.r < b.r; }
bool operator<(const Rect& a, const Rect& b) { return a.r2 < b.r2; }
static int T[17][1 << 17];
void AddRook(int r, int c) {
  T[0][c] = max(T[0][c], r);
  for (int l = 1; l < 17; ++l) {
    c >>= 1;
    T[l][c] = min(T[l - 1][2 * c], T[l - 1][2 * c + 1]);
  }
}
int MinRow(int c1, int c2) {
  int l, res = 999999999;
  for (l = 0; c1 < c2; ++l) {
    if ((c1 & 1) == 1) res = min(res, T[l][c1]), ++c1;
    if ((c2 & 1) == 0) res = min(res, T[l][c2]), --c2;
    c1 >>= 1;
    c2 >>= 1;
  }
  if (c1 == c2) res = min(res, T[l][c1]);
  return res;
}
int main() {
  int K, Q;
  scanf("%*d %*d %d %d", &K, &Q);
  vector<Rook> rooks(K);
  for (int k = 0; k < int(K); ++k) scanf("%d %d", &rooks[k].r, &rooks[k].c);
  vector<Rect> rects(Q);
  for (int q = 0; q < int(Q); ++q) {
    scanf("%d %d %d %d", &rects[q].r1, &rects[q].c1, &rects[q].r2,
          &rects[q].c2);
    rects[q].i = q;
  }
  vector<char> answers(Q);
  for (int pass = 0; pass < 2; ++pass) {
    sort(rooks.begin(), rooks.end());
    sort(rects.begin(), rects.end());
    memset(T, 0, sizeof(T));
    int k = 0;
    int q = 0;
    for (int r = 1; q < int(rects.size()); ++r) {
      while (k < int(rooks.size()) && rooks[k].r == r) {
        AddRook(r, rooks[k].c);
        ++k;
      }
      while (q < int(rects.size()) && rects[q].r2 == r) {
        if (MinRow(rects[q].c1, rects[q].c2) >= rects[q].r1) {
          answers[rects[q].i] = true;
        }
        ++q;
      }
    }
    for (Rook& rook : rooks) swap(rook.r, rook.c);
    for (Rect& rect : rects) {
      swap(rect.r1, rect.c1);
      swap(rect.r2, rect.c2);
    }
  }
  for (bool answer : answers) printf("%s\n", answer ? "YES" : "NO");
}
