#include <bits/stdc++.h>
using namespace std;
int treex[100000 * 8 + 5];
int treey[100000 * 8 + 5];
void update(int* tree, int i, int si, int sj, int q, int val) {
  if (si == sj) {
    tree[i] = val;
  } else {
    int mid = (si + sj) / 2;
    if (q <= mid)
      update(tree, 2 * i, si, mid, q, val);
    else
      update(tree, 2 * i + 1, mid + 1, sj, q, val);
    tree[i] = min(tree[2 * i], tree[2 * i + 1]);
  }
}
int query(int* tree, int i, int si, int sj, int qi, int qj) {
  if (si == qi and sj == qj) {
    return tree[i];
  }
  int mid = (si + sj) / 2;
  if (qj <= mid) return query(tree, 2 * i, si, mid, qi, qj);
  if (mid + 1 <= qi)
    return query(tree, 2 * i + 1, mid + 1, sj, qi, qj);
  else
    return min(query(tree, 2 * i, si, mid, qi, mid),
               query(tree, 2 * i + 1, mid + 1, sj, mid + 1, qj));
}
int ans[200000 + 5];
vector<int> rookx[100000 + 5], rooky[100000 + 5];
vector<pair<pair<int, int>, pair<int, int> > > Qx[100000 + 5], Qy[100000 + 5];
int main() {
  int x, y, x1, x2, y1, y2, N, M, K, Q;
  cin >> N >> M >> K >> Q;
  for (int i = 1; i <= K; ++i) {
    scanf("%d", &x);
    scanf("%d", &y);
    rookx[x].push_back(y);
    rooky[y].push_back(x);
  }
  for (int i = 1; i <= Q; ++i) {
    scanf("%d", &x1);
    scanf("%d", &y1);
    scanf("%d", &x2);
    scanf("%d", &y2);
    Qy[y2].push_back(make_pair(make_pair(i, y1), make_pair(x1, x2)));
    Qx[x2].push_back(make_pair(make_pair(i, x1), make_pair(y1, y2)));
  }
  for (int y = 1; y <= M; ++y) {
    for (int i = 0; i < rooky[y].size(); ++i)
      update(treex, 1, 1, N, rooky[y][i], y);
    for (int i = 0; i < Qy[y].size(); ++i) {
      if (query(treex, 1, 1, N, Qy[y][i].second.first,
                Qy[y][i].second.second) >= Qy[y][i].first.second)
        ans[Qy[y][i].first.first] = 1;
    }
  }
  for (int x = 1; x <= N; ++x) {
    for (int i = 0; i < rookx[x].size(); ++i)
      update(treey, 1, 1, M, rookx[x][i], x);
    for (int i = 0; i < Qx[x].size(); ++i) {
      if (query(treey, 1, 1, M, Qx[x][i].second.first,
                Qx[x][i].second.second) >= Qx[x][i].first.second)
        ans[Qx[x][i].first.first] = 1;
    }
  }
  for (int i = 1; i <= Q; ++i) {
    if (ans[i] == 0)
      printf("NO\n");
    else
      printf("YES\n");
  }
}
