#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:64000000")
const int infi = 1e9 + 7;
const long long infl = 1e18;
const long double eps = 1e-8;
const long double eps1 = 1e-10;
const int mod = (1e9 + 7);
const long long mod1 = 1e9 + 9;
const long long mod2 = 1e9 + 9;
const long long p1 = 31;
const long long p2 = 37;
const long long p3 = 29;
const int ver1 = (62 * 62);
pair<int, int> ar[200500];
struct zapr {
  pair<int, int> a, b;
  int i;
};
zapr zp[200500];
int ans[200500];
bool comp1(pair<int, int> &a, pair<int, int> &b) { return a.second < b.second; }
bool comp2(zapr &a, zapr &b) { return a.b.second < b.b.second; }
int tree[400500];
int getmin(int i, int tl, int tr, int l, int r) {
  if (l > r) {
    return infi;
  }
  if (l == tl && r == tr) {
    return tree[i];
  }
  return min(getmin(i << 1, tl, (tl + tr) >> 1, l, min(r, (tl + tr) >> 1)),
             getmin((i << 1) + 1, ((tl + tr) >> 1) + 1, tr,
                    max(l, ((tl + tr) >> 1) + 1), r));
}
void upd(int i, int tl, int tr, int t, int d) {
  if (tl == tr) {
    tree[i] = d;
    return;
  }
  if (((tl + tr) >> 1) >= t) {
    upd(i << 1, tl, (tl + tr) >> 1, t, d);
  } else {
    upd((i << 1) + 1, ((tl + tr) >> 1) + 1, tr, t, d);
  }
  tree[i] = min(tree[i << 1], tree[(i << 1) + 1]);
  return;
}
int main() {
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  for (int i = 0; i < k; ++i) {
    scanf("%d%d", &ar[i].first, &ar[i].second);
  }
  for (int i = 0; i < q; ++i) {
    scanf("%d%d%d%d", &zp[i].a.first, &zp[i].a.second, &zp[i].b.first,
          &zp[i].b.second);
    ans[i] = 0;
    zp[i].i = i;
  }
  sort(ar, ar + k, comp1);
  sort(zp, zp + q, comp2);
  int j = 0;
  for (int i = 0; i < q; ++i) {
    for (; j < k && ar[j].second <= zp[i].b.second; ++j) {
      upd(1, 1, n, ar[j].first, ar[j].second);
    }
    int a = getmin(1, 1, n, zp[i].a.first, zp[i].b.first);
    if (a >= zp[i].a.second) {
      ans[zp[i].i] = 1;
    }
  }
  memset(tree, 0, sizeof tree);
  for (int i = 0; i < k; ++i) {
    swap(ar[i].first, ar[i].second);
  }
  for (int i = 0; i < q; ++i) {
    swap(zp[i].a.first, zp[i].a.second);
    swap(zp[i].b.first, zp[i].b.second);
  }
  swap(n, m);
  sort(ar, ar + k, comp1);
  sort(zp, zp + q, comp2);
  j = 0;
  for (int i = 0; i < q; ++i) {
    for (; j < k && ar[j].second <= zp[i].b.second; ++j) {
      upd(1, 1, n, ar[j].first, ar[j].second);
    }
    int a = getmin(1, 1, n, zp[i].a.first, zp[i].b.first);
    if (a >= zp[i].a.second) {
      ans[zp[i].i] = 1;
    }
  }
  for (int i = 0; i < q; ++i) {
    if (ans[i]) {
      printf("YES\n");
    } else {
      printf("NO\n");
    }
  }
  return 0;
}
