#include <bits/stdc++.h>
using namespace std;
struct state {
int row_idx;
int col_idx;
state(int r=-1,int c=-1):row_idx(r),col_idx(c) {}
};
int main() {
// freopen("main.in", "r", stdin);
// freopen(".out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int r, c, n; cin >> r >> c >> n;
unordered_map<int, vector<int>> mp;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
mp[a].push_back(b);
}
vector<int> rows;
for (auto &p : mp) {
auto &v = p.second;
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
rows.push_back(p.first);
}
sort(rows.begin(), rows.end());
int k = rows.size();
unordered_map<int, int> rank_row;
rank_row.reserve(k * 2);
for (int i = 0; i < k; i++) rank_row[rows[i]] = i;
vector<vector<int>> col(k);
for (int i = 0; i < k; i++) col[i] = move(mp[rows[i]]);
const int logn = 20;
vector<vector<state>> nxt(logn, vector<state>());
vector<int> off(k + 1, 0);
for (int i = 0; i < k; i++) off[i + 1] = off[i] + (int)col[i].size();
int s = off[k];
for (int b = 0; b < logn; b++) nxt[b].assign(s, state(-1, -1));
auto idx_of = [&](int i, int j) { return off[i] + j; };
for (int i = 0; i < k; i++) {
bool consec = (i + 1 < k) && (rows[i + 1] == rows[i] + 1);
for (int j = 0; j < (int)col[i].size(); j++) {
if (!consec) continue;
int v = col[i][j];
auto &ncol = col[i + 1];
auto it = lower_bound(ncol.begin(), ncol.end(), v);
if (it == ncol.end()) continue;
int nj = it - ncol.begin();
nxt[0][idx_of(i, j)] = state(i + 1, nj);
}
}
for (int b = 1; b < logn; b++) {
for (int u = 0; u < s; u++) {
state mid = nxt[b - 1][u];
if (mid.row_idx == -1) {
nxt[b][u] = state(-1, -1);
continue;
}
int mid_flat = idx_of(mid.row_idx, mid.col_idx);
nxt[b][u] = nxt[b - 1][mid_flat];
}
}
int t;
cin >> t;
while (t--) {
int xs, ys, xt, yt;
cin >> xs >> ys >> xt >> yt;
if (xs > xt || ys > yt) {
cout << "No" << endl;
continue;
}
if (xs == xt) {
cout << "Yes" << endl;
continue;
}
int d = xt - xs;
if (!rank_row.count(xs) || !rank_row.count(xt - 1)) {
cout << "No" << endl;
continue;
}
int rs = rank_row[xs], re = rank_row[xt - 1];
if (re - rs != (xt - 1) - xs) {
cout << "No" << endl;
continue;
}
auto &c0 = col[rs];
auto it0 = lower_bound(c0.begin(), c0.end(), ys);
if (it0 == c0.end() || *it0 > yt) {
cout << "No" << endl;
continue;
}
int j = it0 - c0.begin();
int flat = idx_of(rs, j);
int need = d - 1;
for (int b = 0; b < logn; b++) {
if (need & (1 << b)) {
state ns = nxt[b][flat];
if (ns.row_idx == -1) {
flat = -1;
break;
}
flat = idx_of(ns.row_idx, ns.col_idx);
}
}
if (flat == -1) {
cout << "No" << endl;
continue;
}
int rcur = upper_bound(off.begin(), off.end(), flat) - off.begin() - 1;
int kcur = flat - off[rcur];
int val = col[rcur][kcur];
cout << (val <= yt ? "Yes" : "No") << endl;
}
}
# | 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... |