#include <bits/stdc++.h>
using namespace std;
struct Node {
  int x1, y1, x2, y2;
} qq[2 * 100005];
vector<int> vec[100005];
vector<Node> arr[100005];
bool ans[2 * 100005];
int tree[4 * 100005];
void build(int node, int a, int b) {
  if (a > b) return;
  if (a == b) {
    tree[node] = 0;
    return;
  }
  int left, right;
  left = 2 * node, right = 2 * node + 1;
  build(left, a, (a + b) / 2);
  build(right, (a + b) / 2 + 1, b);
  tree[node] = 0;
}
void update(int node, int a, int b, int i, int j, int val) {
  if (a > b || a > j || b < i) return;
  if (a == b) {
    tree[node] = val;
    return;
  }
  int left, right;
  left = 2 * node, right = 2 * node + 1;
  update(left, a, (a + b) / 2, i, j, val);
  update(right, (a + b) / 2 + 1, b, i, j, val);
  tree[node] = min(tree[left], tree[right]);
}
int query(int node, int a, int b, int i, int j) {
  if (a > b || a > j || b < i) return 100005;
  if (a >= i && b <= j) return tree[node];
  int left, right;
  left = 2 * node, right = 2 * node + 1;
  return min(query(left, a, (a + b) / 2, i, j),
             query(right, (a + b) / 2 + 1, b, i, j));
}
int main() {
  int n, m, k, q;
  scanf("%d %d %d %d", &n, &m, &k, &q);
  pair<int, int> rook[k];
  for (int i = 0; i < k; i++) scanf("%d %d", &rook[i].first, &rook[i].second);
  for (int i = 0; i < q; i++)
    scanf("%d %d %d %d", &qq[i].x1, &qq[i].y1, &qq[i].x2, &qq[i].y2);
  for (int i = 0; i < k; i++) vec[rook[i].second].push_back(rook[i].first);
  for (int i = 0; i < q; i++)
    arr[qq[i].y2].push_back((Node){qq[i].x1, qq[i].y1, qq[i].x2, i});
  for (int i = 1; i <= m; i++) {
    for (int j = 0; j < vec[i].size(); j++)
      update(1, 1, n, vec[i][j], vec[i][j], i);
    for (int j = 0; j < arr[i].size(); j++) {
      int temp = query(1, 1, n, arr[i][j].x1, arr[i][j].x2);
      ans[arr[i][j].y2] |= (temp < arr[i][j].y1 ? false : true);
    }
  }
  for (int i = 0; i < 100005; i++) vec[i].clear(), arr[i].clear();
  build(1, 1, 100005 - 1);
  for (int i = 0; i < k; i++) vec[rook[i].first].push_back(rook[i].second);
  for (int i = 0; i < q; i++)
    arr[qq[i].x2].push_back((Node){qq[i].x1, qq[i].y1, i, qq[i].y2});
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < vec[i].size(); j++)
      update(1, 1, m, vec[i][j], vec[i][j], i);
    for (int j = 0; j < arr[i].size(); j++) {
      int temp = query(1, 1, m, arr[i][j].y1, arr[i][j].y2);
      ans[arr[i][j].x2] |= (temp < arr[i][j].x1 ? false : true);
    }
  }
  for (int i = 0; i < q; i++) printf("%s\n", ans[i] ? "YES" : "NO");
  return 0;
}
