Submission #1280870

#TimeUsernameProblemLanguageResultExecution timeMemory
1280870aegCurtains (NOI23_curtains)C++20
100 / 100
594 ms33732 KiB
#include <bits/stdc++.h> using namespace std; struct segtr { vector<pair<int, int>> lz; int n; segtr(int n) : lz(n << 2, {INT_MAX, INT_MAX}), n(n) {} pair<int, int> unite(pair<int, int> l, pair<int, int> r) { if (l.second > r.second) swap(l, r); if (r.first == INT_MAX) return l; if (l.second >= r.first - 1) return {min(l.first, r.first), r.second}; return l; } void pushdown(int ind) { lz[ind << 1] = unite(lz[ind << 1], lz[ind]); lz[ind << 1 | 1] = unite(lz[ind << 1 | 1], lz[ind]); lz[ind] = {INT_MAX, INT_MAX}; } void update(int ind, int l, int r, int tl, int tr, int x, int y) { if (x > tr || y < tl) return; if (x <= tl && tr <= y) { lz[ind] = unite(lz[ind], {l, r}); return; } pushdown(ind); int m = (tl + tr) >> 1; if (x <= m) update(ind << 1, l, r, tl, m, x, y); if (y > m) update(ind << 1 | 1, l, r, m + 1, tr, x, y); } void upd(int l, int r) { update(1, l, r, 0, n - 1, 0, l); } int quer(int ind, int l, int r, int pos) { if (l == r) { if (pos >= lz[ind].first) return lz[ind].second; else return pos - 1; } pushdown(ind); int m = (l + r) >> 1; if (pos <= m) return quer(ind << 1, l, m, pos); else return quer(ind << 1 | 1, m + 1, r, pos); } int query(int pos) { return quer(1, 0, n - 1, pos); } }; struct quer { int l, r; bool typ; int ind; quer(int l = 0, int r = 0, bool typ = false, int ind = 0) : l(l), r(r), typ(typ), ind(ind) {} }; bool operator<(quer const &q1, quer const &q2) { if (q1.r != q2.r) return q1.r < q2.r; else if (q1.typ != q2.typ) { if (q1.typ) return false; return true; } else if (q1.l != q2.l) return q1.l < q2.l; else return q1.ind < q2.ind; } int main() { cin.tie(0)->sync_with_stdio(0); int n, m, q; cin >> n >> m >> q; vector<bool> ans(q, false); segtr tr(n); vector<quer> qs; for (int i = 0; i < m; i++) { int l, r; cin >> l >> r; l--; r--; qs.emplace_back(l, r, false, i); } for (int i = 0; i < q; i++) { int l, r; cin >> l >> r; l--; r--; qs.emplace_back(l, r, true, i); } sort(qs.begin(), qs.end()); for (int i = 0; i < q + m; i++) { if (qs[i].typ) { int anss = tr.query(qs[i].l); // cout << anss << '\n'; // for (auto &[x, y] : tr.lz) // cout << x << ' ' << y << '\n'; // cout << '\n'; if (anss == qs[i].r) ans[qs[i].ind] = true; } else { tr.upd(qs[i].l, qs[i].r); } } for (int i = 0; i < q; i++) { if (ans[i]) cout << "YES\n"; else cout << "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...
#Verdict Execution timeMemoryGrader output
Fetching results...