#include <bits/stdc++.h>
using namespace std;
const long long INF = 1 << 28;
const long long LINF = 1ll << 61;
inline long long getnum() {
  register long long r = 0;
  register bool ng = 0;
  register char c;
  c = getchar();
  while (c != '-' && (c < '0' || c > '9')) c = getchar();
  if (c == '-') ng = 1, c = getchar();
  while (c != ' ' && c != '\n') r = r * 10 + c - '0', c = getchar();
  if (ng) r = -r;
  return r;
}
template <class T>
inline void putnum(T x) {
  if (x < 0) putchar('-'), x = -x;
  register short a[20] = {}, sz = 0;
  while (x > 0) a[sz++] = x % 10, x /= 10;
  if (sz == 0) putchar('0');
  for (int i = sz - 1; i >= 0; i--) putchar('0' + a[i]);
}
inline void putsp() { putchar(' '); }
inline void putendl() { putchar('\n'); }
const int size = 262144;
struct SGT {
  int a[size * 2 + 5];
  void clear() { memset(a, 0, sizeof(a)); }
  void set(int id, int x) {
    id += size - 1;
    a[id] = x;
    id >>= 1;
    while (id > 0) {
      a[id] = min(a[id << 1], a[id << 1 | 1]);
      id >>= 1;
    }
  }
  int query(int l, int r) {
    l += size - 1;
    r += size;
    int ans = a[l];
    while (l < r) {
      if (l & 1) ans = min(ans, a[l++]);
      if (r & 1) ans = min(ans, a[--r]);
      l >>= 1;
      r >>= 1;
    }
    return ans;
  }
} sgt;
struct query {
  int x1, y1, x2, y2, id;
  bool operator<(const query &tmp) const { return x2 < tmp.x2; }
};
query make_query(int a, int b, int c, int d, int e) {
  query t;
  t.x1 = a;
  t.y1 = b;
  t.x2 = c;
  t.y2 = d;
  t.id = e;
  return t;
}
int n, m, k, qn;
vector<pair<int, int> > pos;
vector<query> q;
bool ans[200111];
int main() {
  n = getnum(), m = getnum(), k = getnum(), qn = getnum();
  int x, y, z, w;
  for (int i = 1; i <= k; i++) {
    x = getnum(), y = getnum();
    pos.push_back(make_pair(x, y));
  }
  for (int i = 1; i <= qn; i++) {
    x = getnum(), y = getnum(), z = getnum(), w = getnum();
    q.push_back(make_query(x, y, z, w, i));
  }
  sort(pos.begin(), pos.end());
  sort(q.begin(), q.end());
  int it = 0;
  for (int i = 0; i < q.size(); i++) {
    while (it < pos.size() && pos[it].first <= q[i].x2)
      sgt.set(pos[it].second, pos[it].first), it++;
    if (sgt.query(q[i].y1, q[i].y2) >= q[i].x1) ans[q[i].id] = 1;
  }
  for (int i = 0; i < pos.size(); i++) swap(pos[i].first, pos[i].second);
  for (int i = 0; i < q.size(); i++)
    swap(q[i].x1, q[i].y1), swap(q[i].x2, q[i].y2);
  sort(pos.begin(), pos.end());
  sort(q.begin(), q.end());
  it = 0;
  sgt.clear();
  for (int i = 0; i < q.size(); i++) {
    while (it < pos.size() && pos[it].first <= q[i].x2)
      sgt.set(pos[it].second, pos[it].first), it++;
    if (sgt.query(q[i].y1, q[i].y2) >= q[i].x1) ans[q[i].id] = 1;
  }
  for (int i = 1; i <= qn; i++) puts(ans[i] ? "YES" : "NO");
  return 0;
}
