#include <bits/stdc++.h>
//
#pragma comment(linker, "/stack:200000000")
//
#pragma GCC optimize("Ofast")
//
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#define pb push_back
#define pii pair <int, int>
#define ll long long
#define ld long double
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define sz(s) (int)s.size()
#define skip continue
using namespace std;
const int N = 4e5 + 7;
const int inf = 1e9 + 7;
const ll INF = 1e18 + 7;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define int ll
int n, m, k;
void f(vector <pii> &v) {
vector <int> vx, vy;
for (auto p : v)vx.pb(p.x), vy.pb(p.y);
sort(all(vx)), sort(all(vy));
map <int, int> id;
int last = -inf, pos = 0;
for (auto x : vx) {
if (x == last)skip;
id[x] = ++pos, last = x;
}
for (auto &p : v)p.x = id[p.x];
last = -inf, pos = 0, id.clear();
for (auto y : vy) {
if (y == last)skip;
id[y] = ++pos, last = y;
}
for (auto &p : v)p.y = id[p.y];
}
struct query {
pii s, f;
int id;
bool operator < (query const &other) const {
return s.x < other.s.x;
}
};
int cnt[N], t[4 * N];
void build(int v, int tl, int tr) {
if (tl == tr) {
t[v] = cnt[tl];
return;
}
int mid = (tl + tr) / 2;
build(v * 2, tl, mid), build(v * 2 + 1, mid + 1, tr);
t[v] = t[v * 2] + t[v * 2 + 1];
}
int get(int v, int tl, int tr, int l, int r) {
if (r < l || tr < l || tl > r)return 0;
if (tl >= l && tr <= r)return t[v];
int mid = (tl + tr) / 2;
return get(v * 2, tl, mid, l, r) + get(v * 2 + 1, mid + 1, tr, l, r);
}
void update(int v, int tl, int tr, int pos) {
if (tl == tr) {
t[v]--;
return;
}
int mid = (tl + tr) / 2;
if (pos <= mid)update(v * 2, tl, mid, pos);
else update(v * 2 + 1, mid + 1, tr, pos);
t[v] = t[v * 2] + t[v * 2 + 1];
}
void solve() {
cin >> n >> m >> k;
set <pii> st;
vector <pii> v;
for (int i = 1;i <= k;i++) {
int x, y;
cin >> x >> y;
v.pb({x, y});
}
int q;
cin >> q;
vector <int> dif(q);
for (int i = 0;i < q;i++) {
pii s, f;
cin >> s.x >> s.y >> f.x >> f.y;
v.pb(s), v.pb(f);
dif[i] = f.x - s.x;
}
f(v);
vector <query> vq;
for (int i = 0;i < (sz(v) - k) / 2;i++) {
pii s, f;
s = v[k + 2 * i], f = v[k + 2 * i + 1];
vq.pb({s, f, i});
}
for (int i = 0;i < k;i++)st.insert({v[i].x, v[i].y}), cnt[v[i].y]++;
sort(all(vq));
build(1, 1, N - 7);
vector <bool> ans(q, 0);
for (int i = 0;i < q;i++) {
pii s = vq[i].s, f = vq[i].f;
int id = vq[i].id;
while (!st.empty() && (*st.begin()).x < s.x) {
pii p = *st.begin();
st.erase(p), update(1, 1, N - 7, p.y);
}
if (s.x > f.x || s.y > f.y) {
ans[id] = 0;
skip;
}
if (get(1, 1, N - 7, s.y, f.y) >= dif[id])ans[id] = 1;
else ans[id] = 0;
}
for (int i = 0;i < q;i++)cout << (ans[i] ? "Yes" : "No") << '\n';
}
signed main() {
//srand(time(NULL));
ios_base::sync_with_stdio(0);
cin.tie(0);
int test = 1;
//cin >> test;
for (int t = 1;t <= test;t++)solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |