#include <bits/stdc++.h>
using namespace std;
class MaxTree {
 private:
  vector<int> T;
  int p;

 public:
  MaxTree(int n) {
    p = 1;
    while (p < n) p *= 2;
    T.resize(2 * p - 1, 1000000001);
  }
  void Insert(int l, int v) {
    l += p - 1;
    T[l] = v;
    while (l > 0) {
      l = ((l - 1) / 2);
      T[l] =
          (((T[2 * l + 1]) > (T[2 * l + 2])) ? (T[2 * l + 1]) : (T[2 * l + 2]));
    }
    return;
  }
  int Query(int l, int r) {
    l += p - 1;
    r += p - 1;
    int ans = (((T[l]) > (T[r])) ? (T[l]) : (T[r]));
    while (((l - 1) / 2) != ((r - 1) / 2)) {
      if (l % 2 == 1) ans = (((ans) > (T[l + 1])) ? (ans) : (T[l + 1]));
      if (r % 2 == 0) ans = (((ans) > (T[r - 1])) ? (ans) : (T[r - 1]));
      l = ((l - 1) / 2);
      r = ((r - 1) / 2);
    }
    return ans;
  }
};
struct query {
  int id, L, R, height;
  query(int _id, int _L, int _R, int _h) : id(_id), L(_L), R(_R), height(_h) {}
};
void solve(int n, int m, vector<vector<int> > &R, vector<vector<query> > &Q,
           vector<bool> &ans) {
  MaxTree Tree(m);
  for (int i = (n - 1); i >= (0); --i) {
    for (int j = (0); j <= ((int)(R[i]).size() - 1); ++j) {
      int pos = R[i][j];
      Tree.Insert(R[i][j], i);
    }
    for (int j = (0); j <= ((int)(Q[i]).size() - 1); ++j) {
      query q = Q[i][j];
      int temp = Tree.Query(q.L, q.R);
      if (temp - i <= q.height) ans[q.id] = 1;
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  vector<vector<int> > Rn(n), Rm(m);
  for (int i = (1); i <= (k); ++i) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    Rn[x].push_back(y);
    Rm[y].push_back(x);
  }
  vector<vector<query> > Qn(n);
  vector<vector<query> > Qm(m);
  for (int i = (0); i <= (q - 1); ++i) {
    int x1, x2, y1, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    x1--;
    y1--;
    x2--;
    y2--;
    int height_n = x2 - x1, height_m = y2 - y1;
    Qn[x1].push_back(query(i, y1, y2, height_n));
    Qm[y1].push_back(query(i, x1, x2, height_m));
  }
  vector<bool> ans(q, 0);
  solve(n, m, Rn, Qn, ans);
  solve(m, n, Rm, Qm, ans);
  for (int i = (0); i <= ((int)(ans).size() - 1); ++i)
    cout << ((ans[i]) ? "YES\n" : "NO\n");
  return 0;
}
