Submission #915249

#TimeUsernameProblemLanguageResultExecution timeMemory
915249dsyzRMQ (NOI17_rmq)C++17
100 / 100
145 ms24872 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define MAXN (1000005) ll N,Q; struct node { ll s,e,m,lazy; pair<ll,ll> v; node *l, *r; node(ll _s,ll _e){ s = _s; e = _e; m = (s + e) / 2; lazy = -1; v = {-1,s}; if(s != e){ l = new node(s,m); r = new node(m + 1,e); } } void propo() { if(lazy == -1) return; v.first = max(v.first,lazy); if(s != e){ l->lazy = max(l->lazy,lazy); r->lazy = max(r->lazy,lazy); } lazy = -1; } void update(ll x,ll y,ll nval){ propo(); if(s == x && e == y){ lazy = max(lazy,nval); return; }else{ if(x > m) r -> update(x,y,nval); else if(y <= m) l -> update(x,y,nval); else l -> update(x,m,nval), r -> update(m + 1,y,nval); l->propo(), r->propo(); v = min(l->v,r->v); } } pair<ll,ll> rmq(ll x,ll y){ propo(); if(s == x && e == y){ return v; }else{ if(x > m) return r -> rmq(x,y); else if(y <= m) return l -> rmq(x,y); else return min(l -> rmq(x,m),r -> rmq(m + 1,y)); } } } *root; int main() { ios_base::sync_with_stdio(false);cin.tie(0); cin>>N>>Q; root = new node(0,N - 1); vector<pair<ll,ll> > ranges[N]; //ranges provided with RMQ = i for(ll q = 0;q < Q;q++){ ll L,R,X; cin>>L>>R>>X; //0-indexed root -> update(L,R,X); ranges[X].push_back({L,R}); } ll ans[N]; memset(ans,-1,sizeof(ans)); bool ok = 1; set<ll> values; for(ll i = 0;i < N;i++){ values.insert(i); } for(ll rmq = N - 1;rmq >= 0;rmq--){ if(ranges[rmq].empty()) continue; ll Lb = -1e18, Ub = 1e18; for(auto u : ranges[rmq]){ Lb = max(Lb,u.first); Ub = min(Ub,u.second); } if(Lb > Ub){ //no intersection at all between ranges with RMQ = value rmq ok = 0; break; } pair<ll,ll> a = root -> rmq(Lb,Ub); if(a.first > rmq){ ok = 0; }else{ ans[a.second] = rmq; //I can prove that setting any element whose v.first == rmq to value rmq between [Lb,Ub] intersection are always optimal values.erase(values.find(rmq)); root -> update(a.second,a.second,1e9); //position a.second is already filled up } } vector<pair<ll,ll> > left; for(ll i = 0;i < N && ok;i++){ if(ans[i] == -1){ pair<ll,ll> a = root -> rmq(i,i); left.push_back({a.first,i}); } } sort(left.begin(),left.end(),greater<pair<ll,ll> >()); for(auto u : left){ if(values.empty() || *prev(values.end()) < u.first){ ok = 0; break; }else{ ans[u.second] = *prev(values.end()); values.erase(prev(values.end())); } } if(!ok){ memset(ans,-1,sizeof(ans)); for(ll i = 0;i < N;i++){ cout<<ans[i]<<" "; } cout<<'\n'; }else{ for(ll i = 0;i < N;i++){ cout<<ans[i]<<" "; } cout<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...