#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 5;
const long long linf = 1e18 + 5;
const int N = 2e5 + 5;
const int M = 1e5 + 5;
int n, m, k, q, kd[M << 2];
bool ans[N];
pair<int, int> a[N];
pair<pair<int, int>, pair<int, int> > qu[N];
vector<int> rookx[N], rooky[N];
vector<pair<pair<int, int>, pair<int, int> > > queries[N];
int init(int root, int bas, int son) {
  if (bas == son) {
    if (rooky[bas].empty())
      kd[root] = inf;
    else
      kd[root] = rooky[bas].front();
    return kd[root];
  }
  return kd[root] = max(init((root + root), bas, ((bas + son) >> 1)),
                        init((root + root + 1), ((bas + son) >> 1) + 1, son));
}
int update(int root, int bas, int son, int x, int k) {
  if (son < x or x < bas) return kd[root];
  if (x <= bas and son <= x) return kd[root] = k;
  return kd[root] =
             max(update((root + root), bas, ((bas + son) >> 1), x, k),
                 update((root + root + 1), ((bas + son) >> 1) + 1, son, x, k));
}
int query(int root, int bas, int son, int x, int y) {
  if (son < x or y < bas) return 0;
  if (x <= bas and son <= y) return kd[root];
  return max(query((root + root), bas, ((bas + son) >> 1), x, y),
             query((root + root + 1), ((bas + son) >> 1) + 1, son, x, y));
}
void solve() {
  init(1, 1, m);
  int cur;
  for (int i = 1; i <= n; i++) {
    for (__typeof((queries[i]).begin()) it = (queries[i]).begin();
         it != (queries[i]).end(); it++)
      if (query(1, 1, m, it->second.first, it->second.second) <=
          it->first.first)
        ans[it->first.second] = 1;
    for (__typeof((rookx[i]).begin()) it = (rookx[i]).begin();
         it != (rookx[i]).end(); it++) {
      cur = upper_bound(rooky[*it].begin(), rooky[*it].end(), i) -
            rooky[*it].begin();
      if (cur == rooky[*it].size())
        cur = inf;
      else
        cur = rooky[*it][cur];
      update(1, 1, m, *it, cur);
    }
  }
}
int main() {
  ios ::sync_with_stdio(0);
  cin >> n >> m >> k >> q;
  for (int i = 1; i <= k; i++) {
    cin >> a[i].first >> a[i].second;
    rookx[a[i].first].push_back(a[i].second);
    rooky[a[i].second].push_back(a[i].first);
  }
  for (int i = 1; i <= n; i++) sort(rookx[i].begin(), rookx[i].end());
  for (int i = 1; i <= m; i++) sort(rooky[i].begin(), rooky[i].end());
  for (int i = 1; i <= q; i++) {
    cin >> qu[i].first.first >> qu[i].first.second >> qu[i].second.first >>
        qu[i].second.second;
    queries[qu[i].first.first].push_back(
        make_pair(make_pair(qu[i].second.first, i),
                  make_pair(qu[i].first.second, qu[i].second.second)));
  }
  solve();
  for (int i = 1; i <= n; i++) queries[i].clear();
  for (int i = 1; i <= q; i++)
    queries[qu[i].first.second].push_back(
        make_pair(make_pair(qu[i].second.second, i),
                  make_pair(qu[i].first.first, qu[i].second.first)));
  for (int i = 1; i <= n; i++) rookx[i].clear();
  for (int i = 1; i <= m; i++) rooky[i].clear();
  for (int i = 1; i <= k; i++) {
    rookx[a[i].second].push_back(a[i].first);
    rooky[a[i].first].push_back(a[i].second);
  }
  swap(n, m);
  for (int i = 1; i <= n; i++) sort(rookx[i].begin(), rookx[i].end());
  for (int i = 1; i <= m; i++) sort(rooky[i].begin(), rooky[i].end());
  solve();
  for (int i = 1; i <= q; i++)
    if (ans[i])
      cout << "YES" << '\n';
    else
      cout << "NO" << '\n';
  return 0;
}
