#include <bits/stdc++.h>
using namespace std;
int n, m, k, q;
struct node {
  int x1, y1, x2, y2;
  int id;
  node(int a, int b, int c, int d, int e) {
    x1 = a;
    y1 = b;
    x2 = c;
    y2 = d;
    id = e;
  }
  bool operator<(const node &n) const { return x1 < n.x1; }
};
const int p = 20;
int tree[1 << p];
int tree2[1 << p];
int M = 1 << (p - 1);
void insert(int pos, int val) {
  pos += M;
  tree[pos] = val;
  if (val)
    tree2[pos] = 1;
  else
    tree2[pos] = 0;
  pos /= 2;
  while (pos) {
    tree[pos] = max(tree[pos * 2], tree[pos * 2 + 1]);
    tree2[pos] = tree2[pos * 2] + tree2[pos * 2 + 1];
    pos /= 2;
  }
}
int query(int left, int right) {
  left += M;
  right += M;
  int result = max(tree[left], tree[right]);
  while (left / 2 != right / 2) {
    if (left % 2 == 0) result = max(result, tree[left + 1]);
    if (right % 2) result = max(result, tree[right - 1]);
    left /= 2;
    right /= 2;
  }
  return result;
}
int query2(int left, int right) {
  left += M;
  right += M;
  int result = tree2[left];
  if (left != right) result += tree2[right];
  while (left / 2 != right / 2) {
    if (left % 2 == 0) result += tree2[left + 1];
    if (right % 2) result += tree2[right - 1];
    left /= 2;
    right /= 2;
  }
  return result;
}
bool res[1000005];
void go(vector<pair<int, int> > rocks, vector<node> que, int stage) {
  sort(rocks.begin(), rocks.end());
  sort(que.begin(), que.end());
  int idx = 0;
  for (int i = 0; i < M; i++) insert(i, 0);
  vector<set<int> > pos(max(n, m) + 1);
  for (int i = 0; i < rocks.size(); i++) {
    pos[rocks[i].second].insert(rocks[i].first);
  }
  for (int i = 0; i < max(n, m) + 1; i++) {
    if (pos[i].size() > 0) {
      insert(i, *pos[i].begin());
    }
  }
  for (int i = 0; i < que.size(); i++) {
    while (idx < rocks.size() && rocks[idx].first < que[i].x1) {
      pos[rocks[idx].second].erase(pos[rocks[idx].second].begin());
      if (pos[rocks[idx].second].size() > 0)
        insert(rocks[idx].second, *pos[rocks[idx].second].begin());
      else
        insert(rocks[idx].second, 0);
      idx++;
    }
    if (query(que[i].y1, que[i].y2) <= que[i].x2 &&
        query2(que[i].y1, que[i].y2) == que[i].y2 - que[i].y1 + 1) {
      res[que[i].id] = 1;
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m >> k >> q;
  vector<pair<int, int> > tab(k);
  for (int i = 0; i < k; i++) cin >> tab[i].first >> tab[i].second;
  sort(tab.begin(), tab.end());
  vector<node> que;
  for (int i = 0; i < q; i++) {
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    que.push_back(node(a, b, c, d, i));
  }
  go(tab, que, 0);
  for (int i = 0; i < k; i++) swap(tab[i].first, tab[i].second);
  for (int i = 0; i < q; i++) {
    swap(que[i].x1, que[i].y1);
    swap(que[i].x2, que[i].y2);
  }
  go(tab, que, 1);
  for (int i = 0; i < q; i++) cout << ((res[i]) ? "YES" : "NO") << endl;
}
