#include <bits/stdc++.h>
using namespace std;
const int primero = 1 << 17;
const int tope = 1 << 18;
int minimo[tope];
void inicializa() {
  for (int i = 0; i < tope; i++) minimo[i] = 0;
}
void inserta(int pos, int val) {
  pos += primero;
  minimo[pos] = val;
  while (pos > 1) {
    pos /= 2;
    minimo[pos] = min(minimo[2 * pos], minimo[2 * pos + 1]);
  }
}
int minimoentre(int pos0, int pos1) {
  pos0 += primero;
  pos1 += primero;
  if (pos0 == pos1) return minimo[pos0];
  int mini = min(minimo[pos0], minimo[pos1]);
  while (pos0 + 1 < pos1) {
    if (pos0 % 2 == 0) mini = min(mini, minimo[pos0 + 1]);
    pos0 /= 2;
    if (pos1 % 2 == 1) mini = min(mini, minimo[pos1 - 1]);
    pos1 /= 2;
  }
  return mini;
}
struct elem {
  int tipo, i1, j1, i2, j2, iq;
  elem() {}
  elem(int intipo, int ini1, int inj1, int ini2, int inj2, int iniq) {
    tipo = intipo;
    i1 = ini1;
    j1 = inj1;
    i2 = ini2;
    j2 = inj2;
    iq = iniq;
  }
};
bool operator<(elem e1, elem e2) {
  if (e1.i2 != e2.i2) return e1.i2 < e2.i2;
  return e1.tipo < e2.tipo;
}
int sol[tope];
void calcula(vector<elem> &v) {
  inicializa();
  sort(v.begin(), v.end());
  for (int d = 0; d < int(v.size()); d++) {
    elem &e = v[d];
    if (e.tipo == 0)
      inserta(e.j2, e.i2);
    else if (minimoentre(e.j1, e.j2) >= e.i1)
      sol[e.iq] = 1;
  }
}
int main() {
  ios::sync_with_stdio(false);
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  vector<elem> hor, ver;
  for (int d = 0; d < k; d++) {
    int i, j;
    cin >> i >> j;
    ver.push_back(elem(0, i, j, i, j, 0));
    hor.push_back(elem(0, j, i, j, i, 0));
  }
  for (int d = 0; d < q; d++) {
    int i1, j1, i2, j2;
    cin >> i1 >> j1 >> i2 >> j2;
    ver.push_back(elem(1, i1, j1, i2, j2, d));
    hor.push_back(elem(1, j1, i1, j2, i2, d));
  }
  calcula(ver);
  calcula(hor);
  for (int d = 0; d < q; d++)
    if (sol[d])
      cout << "YES" << endl;
    else
      cout << "NO" << endl;
}
