Submission #1204912

#TimeUsernameProblemLanguageResultExecution timeMemory
1204912loomRMQ (NOI17_rmq)C++20
100 / 100
161 ms14560 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define inf 5e18 #define nl '\n' const int N = 1e5; int ans[N], seg[4*N], lz[4*N], ix[4*N]; set<int> st; int n; void lazy(int l, int r, int p){ seg[p] += lz[p]; if(l != r){ lz[p*2] += lz[p]; lz[p*2+1] += lz[p]; } lz[p] = 0; } void build(int l, int r, int p){ if(l == r){ if(l >= n) seg[p] = inf; ix[p] = l; return; } int m = (l+r)/2; build(l, m, p*2); build(m+1, r, p*2+1); seg[p] = min(seg[p*2], seg[p*2+1]); ix[p] = (seg[p*2] < seg[p*2+1] ? ix[p*2] : ix[p*2+1]); } void update(int l, int r, int p, int ql, int qr, int v){ lazy(l, r, p); if(qr < l or r < ql) return; if(ql <= l and r <= qr){ lz[p] += v; lazy(l, r, p); return; } int m = (l+r)/2; update(l, m, p*2, ql, qr, v); update(m+1, r, p*2+1, ql, qr, v); seg[p] = min(seg[p*2], seg[p*2+1]); ix[p] = (seg[p*2] < seg[p*2+1] ? ix[p*2] : ix[p*2+1]); } pair<int,int> query(int l, int r, int p, int ql, int qr){ lazy(l, r, p); if(qr < l or r < ql) return {inf, -1}; if(ql <= l and r <= qr) return {seg[p], ix[p]}; int m = (l+r)/2; auto [mn1, ix1] = query(l, m, p*2, ql, qr); auto [mn2, ix2] = query(m+1, r, p*2+1, ql, qr); return {min(mn1, mn2), (mn1 < mn2 ? ix1 : ix2)}; } void upd(int ql, int qr, int v){ update(0, N-1, 1, ql, qr, v); } pair<int,int> qry(int ql, int qr){ return query(0, N-1, 1, ql, qr); } void impos(){ for(int i=0; i<n; i++) cout<<"-1 "; exit(0); } void add(){ auto [mn, ix] = qry(0, n-1); while(mn == 0){ st.insert(ix); upd(ix, ix, inf); auto [mn2, ix2] = qry(0, n-1); mn = mn2; ix = ix2; } } inline void solve(){ int q; cin>>n>>q; build(0, N-1, 1); vector<pair<int,int>> v[n]; while(q--){ int l, r, x; cin>>l>>r>>x; v[x].push_back({l, r}); upd(l, r, 1); } add(); for(int i=0; i<n; i++){ if(v[i].empty()){ if(st.empty()) impos(); auto it = st.begin(); ans[*it] = i; st.erase(it); continue; } int ml = 0, mr = inf; for(auto [l, r] : v[i]){ upd(l, r, -1); ml = max(ml, l); mr = min(mr, r); } add(); auto it = st.lower_bound(ml); if(it == st.end() or *it > mr) impos(); ans[*it] = i; st.erase(it); } for(int i=0; i<n; i++) cout<<ans[i]<<" "; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL);cout.tie(NULL); 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...