Submission #1145297

#TimeUsernameProblemLanguageResultExecution timeMemory
1145297stdfloatTrampoline (info1cup20_trampoline)C++20
100 / 100
745 ms48164 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define all(v)  v.begin(), v.end()

#define ff	first
#define ss	second
#define pii	pair<int, int>

int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);

	int R, C, n;
	cin >> R >> C >> n;

	vector<int> x(n), y(n);
	map<int, vector<pii>> m;
	for (int i = 0; i < n; i++) {
		cin >> x[i] >> y[i];

		m[x[i]].push_back({y[i], i});
	}

	for (auto &i : m)
		sort(all(i.second));

	vector<vector<int>> sp(n, vector<int>(20, -1));
	for (auto i : m) {
		if (m.find(i.ff + 1) == m.end()) continue;

		for (auto j : i.ss) {
			auto t = lower_bound(all(m[i.ff + 1]), pii{j.ff, 0});
			if (t != m[i.ff + 1].end()) sp[j.ss][0] = (*t).ss;
		}
	}
	for (int i = 1; i < 20; i++) {
		for (int j = 0; j < n; j++)
			if (~sp[j][i - 1]) sp[j][i] = sp[sp[j][i - 1]][i - 1];
	}

	int T;
	cin >> T;
	while (T--) {
		int sx, sy, tx, ty;
		cin >> sx >> sy >> tx >> ty;

		int dis = tx - sx - 1;
		if (sx > tx || sy > ty || n < dis) {
			cout << "No\n"; continue;
		}
		if (sx == tx) {
			cout << "Yes\n"; continue;
		}
		if (m.find(sx) == m.end() || m[sx].back().ff < sy) {
			cout << "No\n"; continue;
		}

		int cur = (*lower_bound(all(m[sx]), pii{sy, 0})).ss;
		for (int i = 19; i >= 0 && ~cur; i--)
			if ((dis >> i) & 1) cur = sp[cur][i];

		cout << (~cur && x[cur] + 1 == tx && y[cur] <= ty ? "Yes" : "No") << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...