Submission #1209159

#TimeUsernameProblemLanguageResultExecution timeMemory
1209159lalig777Curtains (NOI23_curtains)C++20
100 / 100
943 ms53488 KiB
#include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <queue> #define int long long using namespace std; vector<pair<int,int> >seg; void push(int p){ seg[p*2].first=min(seg[p].second, seg[p*2].first); seg[p*2+1].first=min(seg[p].second, seg[p*2+1].first); seg[p*2].second=min(seg[p].second, seg[p*2].second); seg[p*2+1].second=min(seg[p].second, seg[p*2+1].second); seg[p].second=1e9; } int find_max(int l, int r, int a, int b, int p){ if (l==a && r==b) return seg[p].first; else if (l>b || r<a) return -1; int m=(l+r)/2; push(p); int max1=find_max(l, m, a, min(m, b), p*2); int max2=find_max(m+1, r, max(a, m+1), b, p*2+1); seg[p].first=max(seg[p*2].first, seg[p*2+1].first); return max(max1, max2); } void prop(int l, int r, int a, int b, int p, int x){ if (l==a && r==b){ seg[p].first=min(x, seg[p].first); seg[p].second=min(x, seg[p].second); return; }else if (l>b || r<a) return; push(p); int m=(l+r)/2; prop(l, m, a, min(m, b), p*2, x); prop(m+1, r, max(m+1, a), b, p*2+1, x); seg[p].first=max(seg[p*2].first, seg[p*2+1].first); } signed main(){ cin.tie(0); ios::sync_with_stdio(false); int n, m, q; cin>>n>>m>>q; priority_queue<pair<int,int> >cortines; for (int i=0; i<m; i++){ int l, r; cin>>l>>r; l--; r--; cortines.push(make_pair(l, r)); } vector<pair<pair<int,int>, int> >query(q); for (int i=0; i<q; i++){ cin>>query[i].first.first>>query[i].first.second; query[i].first.first--; query[i].first.second--; query[i].second=i; }sort(query.begin(), query.end()); vector<bool>ans(q, false); seg.assign(4*n, make_pair(1e9, 1e9)); for (int i=q-1; i>=0; i--){ int s=query[i].first.first, e=query[i].first.second; while (!cortines.empty()){ if (cortines.top().first<s) break; else{ int l=cortines.top().first; int r=cortines.top().second; prop(0, n-1, l, r, 1, r); cortines.pop(); } } if (find_max(0, n-1, s, e, 1)<=e) ans[query[i].second]=true; } for (int i=0; i<q; i++){ if (ans[i]==true) cout<<"YES\n"; else cout<<"NO\n"; } 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...