Submission #1234151

#TimeUsernameProblemLanguageResultExecution timeMemory
1234151GeforgsRMQ (NOI17_rmq)C++20
100 / 100
135 ms23916 KiB
#include <iostream> #include <iomanip> #include <vector> #include <cmath> #include <algorithm> #include <set> #include <queue> #include <map> #include <unordered_map> #include <stack> #include <bitset> #include <string> #include <cstring> #include <iterator> #include <random> #define ll long long #define ld long double #define inf (ll)(2*1e18) #define sort(a) sort(a.begin(), a.end()) #define reverse(a) reverse(a.begin(), a.end()) #define pb push_back #define endl "\n" using namespace std; void build(ll id, ll l, ll r, vector<ll>& a, vector<ll>& b){ if(l == r){ b[id] = a[l]; return; } ll m = (l+r)/2; build(2*id, l, m, a, b); build(2*id+1, m+1, r, a, b); b[id] = min(b[2*id], b[2*id+1]); } ll get(ll id, ll l, ll r, ll tl, ll tr, vector<ll>& b){ if(r < tl or tr < l) return inf; if(tl <= l and r <= tr){ return b[id]; } ll m = (l+r)/2; return min(get(2*id, l, m, tl, tr, b), get(2*id+1, m+1, r, tl, tr, b)); } bool check(ll n, vector<ll>& ans, vector<vector<pair<ll, ll>>>& a){ vector<ll> b(4*n); build(1, 0, n-1, ans, b); for(int i=0;i<n;++i){ for(auto [l, r]: a[i]){ if(get(1, 0, n-1, l, r, b) != i){ return false; } } } return true; } pair<ll, ll> lower(pair<ll, ll> a, pair<ll, ll> b){ return {max(a.first, b.first), min(a.second, b.second)}; } void solve(){ ll n, q, i, l, r, res, x; cin>>n>>q; vector<vector<pair<ll, ll>>> a(n); vector<set<ll>> b(n); vector<vector<ll>> open(n); vector<vector<ll>> close(n); vector<ll> ans(n); multiset<ll> s; set<ll> left; for(i=0;i<q;++i){ cin>>l>>r>>res; a[res].pb({l, r}); open[l].pb(res); close[r].pb(res); } s.insert(0); for(i=0;i<n;++i){ left.insert(i); for(auto el: open[i]){ s.insert(el); } ans[i] = *s.rbegin(); for(auto el: close[i]){ s.erase(s.find(el)); } } if(check(n, ans, a)){ for(i=0;i<n;++i){ b[ans[i]].insert(i); ans[i] = -1; } for(i=0;i<n;++i){ pair<ll, ll> p = {-1, n}; for(auto el: a[i]){ p = lower(p, el); } if(p.first != -1){ if(p.second < p.first){ for(i=0;i<n;++i){ cout<<-1<<' '; } cout<<endl; return; } if(b[i].lower_bound(p.first) == b[i].end()){ for(i=0;i<n;++i){ cout<<-1<<' '; } cout<<endl; return; } x = *b[i].lower_bound(p.first); if(x > p.second){ for(i=0;i<n;++i){ cout<<-1<<' '; } cout<<endl; return; } b[i].erase(x); ans[x] = i; left.erase(i); } } for(i=n-1;i>=0;--i){ for(auto el: b[i]){ if(*left.rbegin() < i){ for(i=0;i<n;++i){ cout<<-1<<' '; } cout<<endl; return; } ans[el] = *left.rbegin(); left.erase(*left.rbegin()); } } for(i=0;i<n;++i){ cout<<ans[i]<<' '; } cout<<endl; }else{ for(i=0;i<n;++i){ cout<<-1<<' '; } cout<<endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); srand(time(nullptr)); ll t=1; // cin>>t; for(;t>0;--t){ solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...