#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100001;
const int MAXQ = 200001;
struct SegTree {
  vector<int> tree;
  SegTree(int n, int value = 0) { tree.assign(4 * n, value); }
  void build(vector<int> &a, int i, int l, int r) {
    if (l == r) {
      tree[i] = a[l];
    } else {
      int m = (l + r) / 2;
      build(a, i * 2, l, m);
      build(a, i * 2 + 1, m + 1, r);
      tree[i] = min(tree[i * 2], tree[i * 2 + 1]);
    }
  }
  int get(int i, int l, int r, int ql, int qr) {
    if (l == ql && r == qr) {
      return tree[i];
    } else {
      int m = (l + r) / 2;
      int res = INT_MAX;
      if (ql <= m) res = min(res, get(i * 2, l, m, ql, min(qr, m)));
      if (qr > m) res = min(res, get(i * 2 + 1, m + 1, r, max(m + 1, ql), qr));
      return res;
    }
  }
  void update(int i, int l, int r, int x, int y) {
    if (l == r) {
      tree[i] = y;
    } else {
      int m = (l + r) / 2;
      if (x <= m) update(i * 2, l, m, x, y);
      if (x > m) update(i * 2 + 1, m + 1, r, x, y);
      tree[i] = min(tree[i * 2], tree[i * 2 + 1]);
    }
  }
};
struct Point {
  int x, y;
  Point(int x, int y) : x(x), y(y) {}
};
struct Rect {
  int x1, x2;
  int y1, y2;
  Rect(int x1, int y1, int x2, int y2) : x1(x1), y1(y1), x2(x2), y2(y2) {}
};
int n, m, k, q;
bool res[MAXQ];
vector<Point> pts;
vector<pair<Rect, int> > rec;
void solve() {
  sort(pts.begin(), pts.end(),
       [](const Point &a, const Point &b) { return a.x < b.x; });
  sort(rec.begin(), rec.end(),
       [](const pair<Rect, int> &a, const pair<Rect, int> &b) {
         return a.first.x2 < b.first.x2;
       });
  SegTree minTree(m, INT_MIN);
  int curPoint = 0;
  for (int i = 0; i < q; ++i) {
    while (curPoint < k && pts[curPoint].x <= rec[i].first.x2) {
      minTree.update(1, 1, m, pts[curPoint].y, pts[curPoint].x);
      curPoint++;
    }
    int minPoint = minTree.get(1, 1, m, rec[i].first.y1, rec[i].first.y2);
    res[rec[i].second] |= minPoint >= rec[i].first.x1;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m >> k >> q;
  pts.resize(k, Point(0, 0));
  for (int i = 0; i < k; ++i) cin >> pts[i].x >> pts[i].y;
  rec.resize(q, {Rect(0, 0, 0, 0), -1});
  for (int i = 0; i < q; ++i) {
    Rect &cur = rec[i].first;
    rec[i].second = i;
    cin >> cur.x1 >> cur.y1 >> cur.x2 >> cur.y2;
  }
  solve();
  swap(n, m);
  for (int i = 0; i < k; ++i) swap(pts[i].x, pts[i].y);
  for (int i = 0; i < q; ++i) {
    swap(rec[i].first.x1, rec[i].first.y1);
    swap(rec[i].first.x2, rec[i].first.y2);
  }
  solve();
  for (int i = 0; i < q; ++i) cout << (res[i] ? "YES" : "NO") << "\n";
}
