#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2 * 105000;
const int INF = (int)1e9;
int n, m, num;
int k, q;
int tree[4 * MAXN];
bool ans[MAXN];
int x[MAXN], y[MAXN], xx[MAXN], yy[MAXN];
vector<pair<pair<pair<int, int>, pair<int, int> >, int> > v;
vector<int> lx[MAXN];
vector<int> ly[MAXN];
int getMin(int l, int r) {
  l = num + l - 1;
  r = num + r - 1;
  int res = INF;
  while (l <= r) {
    if (l & 1) {
      res = min(res, tree[l]);
      l++;
    }
    if (r % 2 == 0) {
      res = min(res, tree[r]);
      r--;
    }
    l /= 2;
    r /= 2;
  }
  return res;
}
void update(int pos, int val) {
  pos = num + pos - 1;
  tree[pos] = val;
  pos /= 2;
  while (pos >= 1) {
    tree[pos] = min(tree[pos * 2], tree[pos * 2 + 1]);
    pos /= 2;
  }
}
int main() {
  scanf("%d %d %d %d", &n, &m, &k, &q);
  num = 1;
  while (num < max(n, m)) num *= 2;
  for (int i = 1; i <= k; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    lx[x].push_back(y);
    ly[y].push_back(x);
  }
  for (int i = 1; i <= q; i++) {
    scanf("%d %d %d %d", &x[i], &y[i], &xx[i], &yy[i]);
  }
  for (int i = 1; i <= q; i++) {
    v.push_back(make_pair(
        make_pair(make_pair(xx[i], x[i]), make_pair(yy[i], y[i])), i));
  }
  sort(v.begin(), v.end());
  int p = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < (int)lx[i].size(); j++) {
      int cur = lx[i][j];
      update(cur, i);
    }
    while (p < (int)v.size() && v[p].first.first.first == i) {
      int l = v[p].first.second.first, r = v[p].first.second.second;
      swap(l, r);
      int from = v[p].first.first.second;
      if (getMin(l, r) >= from) ans[v[p].second] = true;
      p++;
    }
  }
  memset(tree, 0, sizeof(tree));
  for (int i = 0; i < q; i++) {
    swap(v[i].first.first, v[i].first.second);
  }
  sort(v.begin(), v.end());
  p = 0;
  for (int i = 1; i <= m; i++) {
    for (int j = 0; j < (int)ly[i].size(); j++) {
      int cur = ly[i][j];
      update(cur, i);
    }
    while (p < (int)v.size() && v[p].first.first.first == i) {
      int l = v[p].first.second.first, r = v[p].first.second.second;
      swap(l, r);
      int from = v[p].first.first.second;
      if (getMin(l, r) >= from) ans[v[p].second] = true;
      p++;
    }
  }
  for (int i = 1; i <= q; i++) {
    if (ans[i])
      puts("YES");
    else
      puts("NO");
  }
  return 0;
}
