#include <bits/stdc++.h>
using namespace std;
int n, m, k, q;
vector<pair<int, int> > vx;
vector<pair<pair<int, int>, pair<pair<int, int>, int> > > areas;
bool answer[200015];
int segTree[4 * 100015];
void init(int index, int l, int r) {
  if (l == r) {
    segTree[index] = 0;
    return;
  }
  init(index * 2, l, (l + r) / 2);
  init((index * 2) + 1, ((l + r) / 2) + 1, r);
  segTree[index] = 0;
}
void update(int index, int l, int r, int x, int val) {
  if (x < l || x > r) {
    return;
  }
  if (l == r) {
    segTree[index] = val;
    return;
  }
  update(index * 2, l, (l + r) / 2, x, val);
  update(index * 2 + 1, (l + r) / 2 + 1, r, x, val);
  segTree[index] = min(segTree[2 * index], segTree[2 * index + 1]);
}
int query(int index, int l, int r, int x, int y) {
  if (y < l || x > r) {
    return 99999999;
  }
  if ((l > x && r < y) || l == r) {
    return segTree[index];
  }
  return min(query(index * 2, l, (l + r) / 2, x, y),
             query(index * 2 + 1, (l + r) / 2 + 1, r, x, y));
}
void goLeftToRight() {
  sort(areas.begin(), areas.end());
  sort(vx.begin(), vx.end());
  init(1, 1, 100015);
  int indar = 0, index = 0;
  for (int a = 1; a < 100015; a++) {
    while (vx[index].first == a && index < k) {
      update(1, 1, 100015, vx[index].second, vx[index].first);
      index++;
    }
    while (areas[indar].first.first == a && indar < q) {
      if (query(1, 1, 100015, areas[indar].second.first.second,
                areas[indar].first.second) >= areas[indar].second.first.first) {
        answer[areas[indar].second.second] = true;
      }
      indar++;
    }
  }
}
bool cmpareas(pair<pair<int, int>, pair<pair<int, int>, int> > x,
              pair<pair<int, int>, pair<pair<int, int>, int> > y) {
  return x.first.second < y.first.second;
}
bool cmpvx(pair<int, int> x, pair<int, int> y) { return x.second < y.second; }
void goTopToBottom() {
  sort(areas.begin(), areas.end(), cmpareas);
  sort(vx.begin(), vx.end(), cmpvx);
  init(1, 1, 100015);
  int indar = 0, index = 0;
  for (int a = 1; a < 100015; a++) {
    while (vx[index].second == a && index < k) {
      update(1, 1, 100015, vx[index].first, vx[index].second);
      index++;
    }
    while (areas[indar].first.second == a && indar < q) {
      if (query(1, 1, 100015, areas[indar].second.first.first,
                areas[indar].first.first) >= areas[indar].second.first.second) {
        answer[areas[indar].second.second] = true;
      }
      indar++;
    }
  }
}
int main() {
  int x, y, x1, y1;
  scanf("%d%d%d%d", &n, &m, &k, &q);
  for (int a = 0; a < k; a++) {
    scanf("%d%d", &x, &y);
    vx.push_back(make_pair(x, y));
  }
  for (int a = 0; a < q; a++) {
    scanf("%d%d%d%d", &x, &y, &x1, &y1);
    areas.push_back(
        make_pair(make_pair(x1, y1), make_pair(make_pair(x, y), a)));
  }
  goLeftToRight();
  goTopToBottom();
  for (int a = 0; a < q; a++) {
    if (answer[a])
      printf("YES\n");
    else
      printf("NO\n");
  }
  return 0;
}
