#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1 << 17;
const int SIZE = MAXN << 1;
const int MAXQ = 200100;
int N, M;
int K;
vector<int> P[2][MAXN];
int Q;
vector<pair<pair<int, int>, pair<int, int>>> E[2][MAXN];
bool R[MAXQ];
int SEG[SIZE];
void upd(int x, int v) {
  int cur = MAXN + x;
  SEG[cur] = v;
  cur /= 2;
  while (cur) {
    SEG[cur] = min(SEG[cur * 2], SEG[cur * 2 + 1]);
    cur /= 2;
  }
}
int query(int a, int b, int cur = 1, int l = 0, int r = MAXN) {
  if (a >= r || b <= l) {
    return MAXN;
  } else if (a <= l && b >= r) {
    return SEG[cur];
  } else {
    int mid = (l + r) / 2;
    return min(query(a, b, cur * 2, l, mid), query(a, b, cur * 2 + 1, mid, r));
  }
}
void go(int type) {
  for (int i = 1; i <= M; ++i) {
    for (int x : P[type][i]) {
      upd(x, i);
    }
    for (pair<pair<int, int>, pair<int, int>> cur : E[type][i]) {
      if (query(cur.first.first, cur.first.second) >= cur.second.first) {
        R[cur.second.second] = true;
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> N >> M >> K >> Q;
  for (int i = 0; i < K; ++i) {
    int x, y;
    cin >> x >> y;
    P[0][y].push_back(x);
    P[1][x].push_back(y);
  }
  for (int i = 0; i < Q; ++i) {
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    E[0][y2].push_back(pair<pair<int, int>, pair<int, int>>(
        pair<int, int>(x1, x2 + 1), pair<int, int>(y1, i)));
    E[1][x2].push_back(pair<pair<int, int>, pair<int, int>>(
        pair<int, int>(y1, y2 + 1), pair<int, int>(x1, i)));
  }
  go(0);
  swap(N, M);
  memset(SEG, 0, sizeof(SEG));
  go(1);
  for (int i = 0; i < Q; ++i) {
    cout << (R[i] ? "YES\n" : "NO\n");
  }
  return 0;
}
