#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template <class T>
inline bool Min(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
inline bool Max(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
inline int ni() {
  int a;
  scanf("%d", &a);
  return a;
}
inline ll nl() {
  ll a;
  scanf("%lld", &a);
  return a;
}
inline double nd() {
  double a;
  scanf("%lf", &a);
  return a;
}
inline void pi(int a) { printf("%d ", a); }
inline void pl(ll a) { printf("%lld ", a); }
inline void pd(double a) { printf("%.12lf ", a); }
const int N = 2e5 + 100;
const int SZ = 1 << 18;
const int ADD = 0;
using PII = pair<pii, pii>;
pii lad[N];
PII quad[N];
vector<pair<int, pii>> scanline;
bool ans[N];
int tree[SZ + SZ];
void tree_init() {
  for (int i = 0; i < (int)(SZ + SZ); ++i) tree[i] = -1;
}
void tree_set(int pos, int val) {
  pos += SZ;
  tree[pos] = val;
  pos /= 2;
  while (pos) tree[pos] = min(tree[pos + pos], tree[pos + pos + 1]), pos /= 2;
}
int tree_get(int l, int r) {
  int res = INT32_MAX;
  l += SZ;
  r += SZ;
  while (l <= r) {
    if ((l & 1) == 1) Min(res, tree[l]);
    if ((r & 1) == 0) Min(res, tree[r]);
    l = (l + 1) >> 1, r = (r - 1) >> 1;
  }
  return res;
}
void process() {
  tree_init();
  for (auto q : scanline) {
    int act = q.second.first;
    int id = q.second.second;
    if (act == ADD) {
      tree_set(lad[id].second, lad[id].first);
    } else {
      int last = tree_get(quad[id].first.second, quad[id].second.second);
      if (last >= quad[id].first.first) ans[id] = true;
    }
  }
}
void solve() {
  int n = ni();
  int m = ni();
  int k = ni();
  int q = ni();
  for (int i = 0; i < (int)(k); ++i) lad[i] = {ni(), ni()};
  for (int i = 0; i < (int)(q); ++i) quad[i] = {{ni(), ni()}, {ni(), ni()}};
  for (int o = 0; o < (int)(2); ++o) {
    scanline.clear();
    for (int i = 0; i < (int)(k); ++i)
      scanline.push_back(make_pair(lad[i].first, make_pair(ADD, i)));
    for (int i = 0; i < (int)(q); ++i)
      scanline.push_back(make_pair(quad[i].second.first, make_pair(!ADD, i)));
    sort((scanline).begin(), (scanline).end());
    process();
    for (int i = 0; i < (int)(k); ++i) swap(lad[i].first, lad[i].second);
    for (int i = 0; i < (int)(q); ++i)
      swap(quad[i].first.first, quad[i].first.second),
          swap(quad[i].second.first, quad[i].second.second);
  }
  for (int i = 0; i < (int)(q); ++i) puts(ans[i] ? "YES" : "NO");
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  srand((int)clock());
  solve();
  return 0;
}
