Submission #1139188

#TimeUsernameProblemLanguageResultExecution timeMemory
113918812345678RMQ (NOI17_rmq)C++20
100 / 100
101 ms9092 KiB
#include <bits/stdc++.h> using namespace std; const int nx=1e5+5; int n, q, l, r, a, b[nx], cnt, used[nx], res[nx]; vector<pair<int, int>> d[nx]; pair<int, int> rng[nx]; struct segtree { pair<int, int> mn[4*nx]; int lz[4*nx]; void pushlz(int l, int r, int i) { mn[i].first+=lz[i]; if (l!=r) lz[2*i]+=lz[i], lz[2*i+1]+=lz[i]; lz[i]=0; } void build(int l, int r, int i) { if (l==r) return mn[i]={0, l}, void(); int md=(l+r)/2; build(l, md, 2*i); build(md+1, r, 2*i+1); mn[i]=min(mn[2*i], mn[2*i+1]); } void update(int l, int r, int i, int ql, int qr, int vl) { pushlz(l, r, i); if (qr<l||r<ql) return; if (ql<=l&&r<=qr) return lz[i]+=vl, pushlz(l, r, i), void(); int md=(l+r)/2; update(l, md, 2*i, ql, qr, vl); update(md+1, r, 2*i+1, ql, qr, vl); mn[i]=min(mn[2*i], mn[2*i+1]); } pair<int, int> query(int l, int r, int i, int ql, int qr) { pushlz(l, r, i); if (qr<l||r<ql) return {1e9, 0}; if (ql<=l&&r<=qr )return mn[i]; int md=(l+r)/2; return min(query(l, md, 2*i, ql, qr), query(md+1, r ,2*i+1, ql, qr)); } } s; pair<int, int> merge(pair<int, int> x, pair<int, int> y) { if (x.first==-1||y.first==-1) return {-1, -1}; if (max(x.first, y.first)<=min(x.second, y.second)) return {max(x.first, y.first), min(x.second, y.second)}; return {-1, -1}; } int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>q; s.build(0, n-1, 1); for (int i=0; i<q; i++) cin>>l>>r>>a, d[a].push_back({l, r}); for (int i=n-1; i>=0; i--) { rng[i]={0, n-1}; for (auto x:d[i]) { rng[i]=merge(rng[i], x); s.update(0, n-1, 1, x.first, x.second, 1); } if (rng[i].first==-1) { for (int j=0; j<n; j++) cout<<-1<<' '; cout<<'\n'; return 0; } } for (int i=0; i<n; i++) { for (auto x:d[i]) s.update(0, n-1, 1, x.first, x.second, -1); auto tmp=s.query(0, n-1, 1, rng[i].first, rng[i].second); //cout<<"debug "<<i<<' '<<tmp.first<<' '<<tmp.second<<'\n'; if (tmp.first) { for (int j=0; j<n; j++) cout<<-1<<' '; cout<<'\n'; return 0; } res[tmp.second]=i; s.update(0, n-1, 1, tmp.second, tmp.second, 1e9); } for (int i=0; i<n; i++) cout<<res[i]<<' '; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...