Submission #1146198

#TimeUsernameProblemLanguageResultExecution timeMemory
1146198mannshah1211Curtains (NOI23_curtains)C++20
100 / 100
1107 ms80456 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "deb.h" #else #define debug(...) #endif class segtree { public: vector<int> tree, lazy, ands; int n; segtree(int _n) : n(_n) { tree.resize(4 * n); fill(tree.begin(), tree.end(), -1); lazy.resize(4 * n); ands.resize(4 * n); } void apply(int v, int x, bool prv) { lazy[v] = max(lazy[v], x); tree[v] = max(tree[v], x); if (prv) { ands[v] = true; } } void modify(int v, int l, int r, int ll, int rr, int x) { if (ll >= r || l >= rr) { return; } if (ll >= l && rr <= r) { apply(v, x, true); return; } int m = (ll + rr) / 2; apply(2 * v + 1, lazy[v], ands[v]); apply(2 * v + 2, lazy[v], ands[v]); modify(2 * v + 1, l, r, ll, m, x); modify(2 * v + 2, l, r, m, rr, x); tree[v] = min(tree[2 * v + 1], tree[2 * v + 2]); ands[v] = ands[2 * v + 1] && ands[2 * v + 2]; } pair<int, int> get(int v, int l, int r, int ll, int rr) { if (ll >= r || l >= rr) { return make_pair(int(1e9), true); } if (ll >= l && rr <= r) { return make_pair(tree[v], ands[v]); } int m = (ll + rr) / 2; apply(2 * v + 1, lazy[v], ands[v]); apply(2 * v + 2, lazy[v], ands[v]); pair<int, int> lc = get(2 * v + 1, l, r, ll, m); pair<int, int> rc = get(2 * v + 2, l, r, m, rr); return make_pair(min(lc.first, rc.first), lc.second && rc.second); } }; void solve() { int n, m, q; cin >> n >> m >> q; vector<pair<int, int>> procs(m); for (int i = 0; i < m; i++) { cin >> procs[i].first >> procs[i].second; --procs[i].first; --procs[i].second; } vector<vector<pair<int, int>>> at(n); vector<vector<int>> rn(n); for (int i = 0; i < q; i++) { int l, r; cin >> l >> r; --l; --r; at[r].push_back(make_pair(l, i)); } for (int i = 0; i < m; i++) { rn[procs[i].second].push_back(procs[i].first); } vector<bool> ans(q); segtree seg(n); vector<int> mx(n, -1); vector<bool> cov(n); for (int i = 0; i < n; i++) { for (int x : rn[i]) { seg.modify(0, x, i + 1, 0, n, x); } for (auto [k, idx] : at[i]) { ans[idx] = (seg.get(0, k, i + 1, 0, n).first >= k) && (seg.get(0, k, i + 1, 0, n).second); } } for (int i = 0; i < q; i++) { cout << (ans[i] ? "YES" : "NO") << '\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...