#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
struct node {
  int left, right, min;
  node* child_left;
  node* child_right;
  node() {
    left = 0;
    right = 0;
    child_left = nullptr;
    child_right = nullptr;
    min = INF;
  }
  ~node() {
    if (child_left) {
      delete child_left;
    }
    if (child_right) {
      delete child_right;
    }
  }
};
int get_min(node* root) {
  if (!root) {
    return INF;
  }
  return root->min;
}
node* build(int l, int r) {
  node* root = new node();
  root->left = l;
  root->right = r;
  if (l == r) {
    root->min = 0;
    return root;
  }
  int m = (l + r) / 2;
  root->child_left = build(l, m);
  root->child_right = build(m + 1, r);
  root->min = min(get_min(root->child_left), get_min(root->child_right));
  return root;
}
node* update(node* root, int ind, int x) {
  if (!root) {
    return root;
  }
  if (root->left > ind || root->right < ind) {
    return root;
  }
  if (root->left == root->right) {
    root->min = x;
    return root;
  }
  root->child_left = update(root->child_left, ind, x);
  root->child_right = update(root->child_right, ind, x);
  root->min = min(get_min(root->child_left), get_min(root->child_right));
  return root;
}
int get_ans(node* root, int l, int r) {
  if (!root || root->left > r || root->right < l) {
    return INF;
  }
  if (root->left >= l && root->right <= r) {
    return root->min;
  }
  return min(get_ans(root->child_left, l, r), get_ans(root->child_right, l, r));
}
struct rook {
  int x, y;
  rook(int a = 0, int b = 0) {
    x = a;
    y = b;
  }
};
bool comp1(rook a, rook b) {
  if (a.x == b.x) {
    return a.y < b.y;
  }
  return a.x < b.x;
}
bool comp2(rook a, rook b) {
  if (a.y == b.y) {
    return a.x < b.x;
  }
  return a.y < b.y;
}
struct rect {
  int x1, x2, y1, y2;
  long long num;
  rect(int a = 0, int b = 0, int c = 0, int d = 0) {
    x1 = a;
    y1 = b;
    x2 = c;
    y2 = d;
    num = 0;
  }
};
bool cmp1(rect a, rect b) {
  if (a.x2 == b.x2) {
    if (a.y2 == b.y2) {
      if (a.x1 == b.x1) {
        return a.y1 < b.y1;
      }
      return a.x1 < b.x1;
    }
    return a.y2 < b.y2;
  }
  return a.x2 < b.x2;
}
bool cmp2(rect a, rect b) {
  if (a.y2 == b.y2) {
    if (a.x2 == b.x2) {
      if (a.y1 == b.y1) {
        return a.x1 < b.x1;
      }
      return a.y1 < b.y1;
    }
    return a.x2 < b.x2;
  }
  return a.y2 < b.y2;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  vector<rook> a(k);
  vector<rect> b(q);
  vector<bool> ans(q, 0);
  for (int i = 0; i < k; ++i) {
    cin >> a[i].x >> a[i].y;
  }
  for (int i = 0; i < q; ++i) {
    cin >> b[i].x1 >> b[i].y1 >> b[i].x2 >> b[i].y2;
    b[i].num = i;
  }
  sort(a.begin(), a.end(), comp1);
  sort(b.begin(), b.end(), cmp1);
  node* root1 = build(1, max(n, m));
  int j = -1;
  for (int i = 0; i < q; ++i) {
    while (j + 1 < a.size() && a[j + 1].x <= b[i].x2) {
      j++;
      root1 = update(root1, a[j].y, a[j].x);
    }
    if (get_ans(root1, b[i].y1, b[i].y2) >= b[i].x1) {
      ans[b[i].num] = 1;
    }
  }
  delete root1;
  sort(a.begin(), a.end(), comp2);
  sort(b.begin(), b.end(), cmp2);
  node* root2 = build(1, max(m, n));
  j = -1;
  for (int i = 0; i < q; ++i) {
    while (j + 1 < a.size() && a[j + 1].y <= b[i].y2) {
      j++;
      root2 = update(root2, a[j].x, a[j].y);
    }
    if (get_ans(root2, b[i].x1, b[i].x2) >= b[i].y1) {
      ans[b[i].num] = 1;
    }
  }
  delete root2;
  for (auto i : ans) {
    if (i) {
      cout << "YES\n";
    } else {
      cout << "NO\n";
    }
  }
  return 0;
}
