#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:100000000")
pair<int, int> mas[200100];
bool ans[200100];
pair<pair<pair<int, int>, pair<int, int> >, int> uch[200100];
const int maxN = 100200;
int tree1[maxN * 4];
int tree2[maxN * 4];
const int oo = -1;
void build(int *tree, int v, int l, int r) {
  if (l == r) {
    tree[v] = oo;
    return;
  }
  int mid = (l + r) >> 1;
  build(tree, 2 * v, l, mid);
  build(tree, 2 * v + 1, mid + 1, r);
  tree[v] = min(tree[2 * v], tree[2 * v + 1]);
}
void change(int *tree, int v, int l, int r, int pos, int value) {
  if (l == r && l == pos) {
    tree[v] = value;
    return;
  }
  int mid = (l + r) >> 1;
  if (pos <= mid)
    change(tree, 2 * v, l, mid, pos, value);
  else
    change(tree, 2 * v + 1, mid + 1, r, pos, value);
  tree[v] = min(tree[2 * v], tree[2 * v + 1]);
}
int get(int *tree, int v, int l, int r, int L, int R) {
  if (l == L && r == R) return tree[v];
  int mid = (L + R) >> 1;
  if (r <= mid)
    return get(tree, 2 * v, l, r, L, mid);
  else if (l > mid)
    return get(tree, 2 * v + 1, l, r, mid + 1, R);
  else
    return min(get(tree, 2 * v, l, mid, L, mid),
               get(tree, 2 * v + 1, mid + 1, r, mid + 1, R));
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  build(tree1, 1, 0, 100100);
  build(tree2, 1, 0, 100100);
  int k, q;
  scanf("%d %d", &k, &q);
  for (int i = 0; i < k; i++) {
    scanf("%d %d", &mas[i].first, &mas[i].second);
  }
  sort(mas, mas + k);
  for (int i = 0; i < q; i++) {
    scanf("%d %d %d %d", &uch[i].first.second.first,
          &uch[i].first.second.second, &uch[i].first.first.first,
          &uch[i].first.first.second);
    uch[i].second = i;
  }
  sort(uch, uch + q);
  int p = 0;
  for (int i = 0; i < q; i++) {
    while (p < k && mas[p].first <= uch[i].first.first.first) {
      change(tree1, 1, 0, 100100, mas[p].second, mas[p].first);
      p++;
    }
    int val = get(tree1, 1, uch[i].first.second.second,
                  uch[i].first.first.second, 0, 100100);
    if (val >= uch[i].first.second.first) ans[uch[i].second] = true;
  }
  for (int i = 0; i < k; i++) {
    swap(mas[i].first, mas[i].second);
  }
  sort(mas, mas + k);
  for (int i = 0; i < q; i++) {
    swap(uch[i].first.first.first, uch[i].first.first.second);
    swap(uch[i].first.second.first, uch[i].first.second.second);
  }
  sort(uch, uch + q);
  p = 0;
  for (int i = 0; i < q; i++) {
    while (p < k && mas[p].first <= uch[i].first.first.first) {
      change(tree2, 1, 0, 100100, mas[p].second, mas[p].first);
      p++;
    }
    int val = get(tree2, 1, uch[i].first.second.second,
                  uch[i].first.first.second, 0, 100100);
    if (val >= uch[i].first.second.first) ans[uch[i].second] = true;
  }
  for (int i = 0; i < q; i++) {
    if (ans[i])
      printf("YES\n");
    else
      printf("NO\n");
  }
  return 0;
}
