#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
constexpr LL INF = LLONG_MAX / 2 - 1;
constexpr int iINF = INT_MAX / 2 - 1;
struct MaxMinTree {
  int LC = 4;
  vector<int> tree;
  MaxMinTree(int n) {
    while (LC < n) LC *= 2;
    tree.assign(2 * LC, -iINF);
  }
  void Maximize(int val, int pos) {
    int v = pos + LC;
    tree[v] = max(tree[v], val);
    while (v /= 2) tree[v] = min(tree[2 * v], tree[2 * v + 1]);
  }
  int _GetMin(int v, int a, int b, int tl, int tr) {
    int res = iINF;
    for (a += LC - 1, b += LC + 1; (a >> 1) != (b >> 1); a >>= 1, b >>= 1) {
      if ((a & 1) == 0) res = min(res, tree[a ^ 1]);
      if ((b & 1) == 1) res = min(res, tree[b ^ 1]);
    }
    return res;
  }
  int GetMin(int a, int b) { return _GetMin(1, a, b, 0, LC - 1); }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  ;
  ;
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  vector<vector<int>> a0(n + 1), a1(m + 1);
  for (int i = (1), iend = (k); i <= iend; ++i) {
    int x, y;
    cin >> x >> y;
    a0[x].emplace_back(y);
    a1[y].emplace_back(x);
  }
  struct T {
    int l, r, x, idx;
  };
  vector<vector<T>> b0(n + 1), b1(m + 1);
  for (int i = (0), iend = (q - 1); i <= iend; ++i) {
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    b0[x2].push_back({y1, y2, x1, i});
    b1[y2].push_back({x1, x2, y1, i});
  }
  vector<bool> ok(q, false);
  MaxMinTree tree(m + 1);
  for (int x = (1), xend = (n); x <= xend; ++x) {
    for (auto& y : a0[x]) tree.Maximize(x, y);
    for (auto& [l, r, x, idx] : b0[x])
      if (x <= tree.GetMin(l, r)) ok[idx] = true;
  }
  tree = MaxMinTree(n + 1);
  for (int y = (1), yend = (m); y <= yend; ++y) {
    for (auto& x : a1[y]) tree.Maximize(y, x);
    for (auto& [l, r, x, idx] : b1[y])
      if (x <= tree.GetMin(l, r)) ok[idx] = true;
  }
  for (auto i = (0); i <= (q - 1); i++)
    if (ok[i])
      cout << "YES\n";
    else
      cout << "NO\n";
}
