#include <bits/stdc++.h>   using namespace std;   const int MAXN = 2e5 + 10, INF = 1e9;   struct event {     int pos, start, end, val, t, i;     event(int a, int b, int c, int d, int e, int f)         : pos(a), start(b), end(c), val(d), t(e), i(f){};   };   bool comp(event a, event b) {     if (a.pos != b.pos)       return a.pos < b.pos;     else       return a.t < b.t;   }   vector<event> vx, vy;   bool ok[MAXN];   int minx[MAXN], miny[MAXN];   int seg[4 * MAXN];   void clear(int i, int ini, int fim) {     seg[i] = 0;     if (ini == fim)       return;     else {       int mid = (ini + fim) / 2;       clear(i * 2, ini, mid);       clear(i * 2 + 1, mid + 1, fim);     }   }   void update(int i, int ini, int fim, int pos, int val) {     if (pos < ini || pos > fim)       return;     else {       if (ini == fim)         seg[i] = val;       else {         int mid = (ini + fim) / 2;         update(i * 2, ini, mid, pos, val);         update(i * 2 + 1, mid + 1, fim, pos, val);         seg[i] = min(seg[i * 2], seg[i * 2 + 1]);       }     }   }   int query(int i, int ini, int fim, int p, int q) {     if (ini >= p && fim <= q) return seg[i];     if (q < ini || p > fim)       return INF;     else {       int mid = (ini + fim) / 2;       return min(query(i * 2, ini, mid, p, q),                  query(i * 2 + 1, mid + 1, fim, p, q));     }   }   void print(int i, int ini, int fim) {     printf( i %d ini %d fim %d seg %d n , i, ini, fim, seg[i]);     if (ini != fim) {       int mid = (ini + fim) / 2;       print(i * 2, ini, mid);       print(i * 2 + 1, mid + 1, fim);     }   }   int main() {     int n, m, p, q;     scanf( %d %d %d %d , &n, &m, &p, &q);     for (int i = 0, a, b; i < p; i++) {       scanf( %d %d , &a, &b);       vx.push_back(event(a, 0, 0, b, 1, i));       vy.push_back(event(b, 0, 0, a, 1, i));     }     for (int i = 0, a, b, c, d; i < q; i++) {       scanf( %d %d %d %d , &a, &b, &c, &d);       vx.push_back(event(c, b, d, 0, 2, i));       vy.push_back(event(d, a, c, 0, 2, i));       minx[i] = a;       miny[i] = b;     }     sort(vx.begin(), vx.end(), comp);     sort(vy.begin(), vy.end(), comp);     clear(1, 1, max(m, n));     for (int i = 0; i < vx.size(); i++) {       if (vx[i].t == 1) {         update(1, 1, m, vx[i].val, vx[i].pos);       } else {         if (query(1, 1, m, vx[i].start, vx[i].end) >= minx[vx[i].i])           ok[vx[i].i] = 1;       }     }     clear(1, 1, max(m, n));     for (int i = 0; i < vy.size(); i++) {       if (vy[i].t == 1) {         update(1, 1, n, vy[i].val, vy[i].pos);       } else {         if (query(1, 1, n, vy[i].start, vy[i].end) >= miny[vy[i].i])           ok[vy[i].i] = 1;       }     }     for (int i = 0; i < q; i++) {       if (ok[i])         printf( YES n );       else         printf( NO n );     }   }   