#include <bits/stdc++.h>
using namespace std;
int tr[300001];
int query(int i, int st, int en, int x, int y) {
  if (st >= x && en <= y) return tr[i];
  if (en < x || st > y) return 0;
  int mid = (st + en) / 2;
  int l = query(i * 2, st, mid, x, y);
  int r = query(i * 2 + 1, mid + 1, en, x, y);
  return max(l, r);
}
int update(int i, int st, int en, int x, int val) {
  if (en < x || st > x) return tr[i];
  if (st == en) return tr[i] = val;
  int mid = (st + en) / 2;
  int l = update(i * 2, st, mid, x, val);
  int r = update(i * 2 + 1, mid + 1, en, x, val);
  return tr[i] = max(l, r);
}
int main() {
  int n, m, k, q;
  scanf("%d %d %d %d", &n, &m, &k, &q);
  vector<queue<int> > x(n + 1);
  vector<queue<int> > y(m + 1);
  vector<pair<int, int> > A;
  for (int i = 0; i < k; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    A.push_back(make_pair(a, b));
  }
  sort(A.begin(), A.end());
  for (int i = 0; i < A.size(); i++) {
    x[A[i].first].push(A[i].second);
    y[A[i].second].push(A[i].first);
  }
  vector<pair<pair<pair<int, int>, pair<int, int> >, int> > Q(q);
  for (int i = 0; i < q; i++) {
    int x1, x2, y1, y2;
    scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
    Q[i].first.first.first = x1;
    Q[i].first.first.second = x2;
    Q[i].first.second.first = y1;
    Q[i].first.second.second = y2;
    Q[i].second = i;
  }
  sort(Q.begin(), Q.end());
  for (int i = 1; i <= m; i++) {
    if (!y[i].empty())
      update(1, 1, m, i, y[i].front());
    else
      update(1, 1, m, i, 1000000);
  }
  vector<bool> ans(q, false);
  int minx = 0;
  for (int i = 0; i < q; i++) {
    int newX = Q[i].first.first.first;
    while (minx < A.size() && A[minx].first < newX) {
      y[A[minx].second].pop();
      if (y[A[minx].second].empty())
        update(1, 1, m, A[minx].second, 1000000);
      else
        update(1, 1, m, A[minx].second, y[A[minx].second].front());
      minx++;
    }
    int qu = query(1, 1, m, Q[i].first.second.first, Q[i].first.second.second);
    if (qu <= Q[i].first.first.second) ans[Q[i].second] = true;
  }
  for (int i = 0; i < A.size(); i++) swap(A[i].first, A[i].second);
  sort(A.begin(), A.end());
  for (int i = 0; i < q; i++) swap(Q[i].first.first, Q[i].first.second);
  sort(Q.begin(), Q.end());
  for (int i = 1; i <= n; i++) {
    if (!x[i].empty())
      update(1, 1, n, i, x[i].front());
    else
      update(1, 1, n, i, 1000000);
  }
  int miny = 0;
  for (int i = 0; i < q; i++) {
    int newY = Q[i].first.first.first;
    while (miny < A.size() && A[miny].first < newY) {
      x[A[miny].second].pop();
      if (x[A[miny].second].empty())
        update(1, 1, n, A[miny].second, 1000000);
      else
        update(1, 1, n, A[miny].second, x[A[miny].second].front());
      miny++;
    }
    int qu = query(1, 1, n, Q[i].first.second.first, Q[i].first.second.second);
    if (qu <= Q[i].first.first.second) ans[Q[i].second] = true;
  }
  for (int i = 0; i < q; i++) {
    if (ans[i])
      printf("YES\n");
    else
      printf("NO\n");
  }
}
