Submission #1165172

#TimeUsernameProblemLanguageResultExecution timeMemory
1165172kidkidsCurtains (NOI23_curtains)C++20
20 / 100
814 ms28132 KiB
#include <bits/stdc++.h> using namespace std; #define x21 2*x+1 #define x2 2*x typedef pair<int, int> pii; const int sz = 500100; const int maxn = sz * 4 + 100; struct SegTree { int seg[maxn] = {}; int lazy[maxn] = {}; void push(int x, int tl, int tr) { if (lazy[x] == 0) return; int m = (tl + tr) / 2; seg[2 * x] = max(seg[2 * x], lazy[x]); if (seg[2 * x] > tl) seg[2 * x] = tl; seg[2 * x + 1] = max(seg[2 * x + 1], lazy[x]); if (seg[2 * x + 1] > m + 1) seg[2 * x + 1] = m + 1; lazy[2 * x + 1] = max(lazy[2 * x + 1], lazy[x]); lazy[2 * x] = max(lazy[2 * x + 1], lazy[x]); lazy[x] = 0; } void add(int v, int l, int r, int x, int tl, int tr) { if (l > r || l > tr || tl > r) { return; } // cout<<l<<' '<<r<<' '<<tl<<' '<<tr<<' '<<x<<'\n'; if (l == tl && r == tr) { lazy[x] = max(v, lazy[x]); seg[x] = max(v, seg[x]); if (seg[x] > tl) seg[x] = tl; // cout<<'a'; return; } push(x,tl,tr); int m = (tl + tr) / 2; add(v, l, min(r, m), x2, tl, m); add(v, max(l, m + 1), r, x21, m + 1, tr); seg[x] = min(seg[x2], seg[x21]); if (seg[x] > tl) seg[x] = tl; } void add(int v, int l, int r) { add(v, l, r, 1, 0, sz - 1); } int query(int l, int r, int x, int tl, int tr) { if (l > r || l > tr || tl > r) { return 1e7; } if (l == tl && r == tr) { // cout<<'a'<<seg[x]<<'a'; return seg[x]; } // cout<<l<<' '<<r<<' '<<tl<<' '<<tr<<' '<<seg[x]<<'\n'; push(x,tl,tr); int m = (tl + tr) / 2; return min( query(l, min(r, m), x2, tl, m), query(max(l, m + 1), r, x21, m + 1, tr)); } int query(int l, int r) { return query(l, r, 1, 0, sz - 1); } }; bool comp(pii a, pii b) { if (a.second == b.second) return a.first < b.first; return a.second < b.second; } bool comp1(pair<pii, int> a, pair<pii, int> b) { if (a.first.second == b.first.second) return a.first.first < b.first.first; return a.first.second < b.first.second; } int main() { int a, b, c; cin >> a >> b >> c; pii p[b + 10]; for (int i = 0;i < b;i++) { cin >> p[i].first >> p[i].second; } SegTree seg; sort(p, p + b, comp); // for (int i = 0;i < b;i++) { // cout << p[i].first << ' ' << p[i].second << '\n'; // seg.add(p[i].first, p[i].first, p[i].second); // for (int i = 1;i < a+5;i++) { // cout << seg.query(i, i) << ' '; // } // cout << '\n'; // } pair<pii, int> qq[c + 10]; for (int i = 0;i < c;i++) { cin >> qq[i].first.first >> qq[i].first.second; qq[i].second = i; } sort(qq, qq + c, comp1); bool ans[c+10]; int j = 0; for (int i = 0;i < c;i++) { while(j!=b&&p[j].second<=qq[i].first.second){ seg.add(p[j].first, p[j].first, p[j].second); j++; } int l =qq[i].first.first,r = qq[i].first.second; ans[qq[i].second] = (seg.query(l,r)==l ? 1 : 0); // cout << qq[i].first.first << ' ' << qq[i].first.second << ' ' << seg.query(l,r) << ' '<< j <<'\n'; } for(int i = 0;i<c;i++){ cout<<(ans[i] ? "YES\n" : "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...