Submission #1300665

#TimeUsernameProblemLanguageResultExecution timeMemory
1300665danglayloi1RMQ (NOI17_rmq)C++20
0 / 100
2 ms344 KiB
#include <bits/stdc++.h> #define ii pair<int, int> #define fi first #define se second #define inf 0x3f3f3f3f3f3f3f3f using namespace std; using ll = long long; const ll mod=1e9+7; const int nx=1e5+5; int n, q, nod[nx<<2], la[nx<<2], res[nx], a[nx]; vector<ii> ve[nx]; void build(int id, int l, int r) { la[id]=0; if(l==r) return void(nod[id]=1); int mid=(l+r)>>1; build(id<<1, l, mid); build(id<<1|1, mid+1, r); nod[id]=1; } void down(int id) { if(!la[id]) return; for(int j = id*2; j <= id*2+1; j++) la[j]=max(la[j], la[id]), nod[j]=max(nod[j], la[id]); la[id]=0; } void update(int id, int l, int r, int u, int v, int val) { if(l>v || r<u) return; if(l>=u && r<=v) { nod[id]=max(nod[id], val); la[id]=max(la[id], val); return; } int mid=(l+r)>>1; down(id); update(id<<1, l, mid, u, v, val); update(id<<1|1, mid+1, r, u, v, val); nod[id]=nod[id<<1], nod[id<<1|1]; } int get(int id, int l, int r, int p) { if(l>p || r<p) return 0; if(l==r) return nod[id]; int mid=(l+r)>>1; down(id); return max(get(id<<1, l, mid, p), get(id<<1|1, mid+1, r, p)); } set<int> st; void sus() { for(int i = 1; i <= n; i++) cout<<-1<<' '; exit(0); } vector<int> rem, val; bool cmp(int x, int y) { return a[x]<a[y]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>q; build(1, 1, n); while(q--) { int l, r, x; cin>>l>>r>>x; l++, r++, x++; ve[x].emplace_back(l, r); update(1, 1, n, l, r, x); } for(int i = 1; i <= n; i++) { res[i]=0; a[i]=get(1, 1, n, i); st.emplace(i); } for(int i = n; i >= 1; i--) { if(ve[i].empty()) continue; ii p=ve[i][0]; for(auto it:ve[i]) p.fi=max(p.fi, it.fi), p.se=min(p.se, it.se); if(p.fi>p.se) sus(); auto it=st.lower_bound(p.fi); if(it==st.end() || *it>p.se) sus(); res[*it]=i; for(it = st.lower_bound(p.fi); it != st.end() && *it <= p.se;) it=st.erase(it); } for(int i = 1; i <= n; i++) { if(res[i]==0) rem.emplace_back(i); if(ve[i].empty()) val.emplace_back(i); } sort(rem.begin(), rem.end(), cmp); for(int i = 0; i < rem.size(); i++) { if(a[rem[i]]>val[i]) sus(); res[rem[i]]=val[i]; } for(int i = 1; i <= n; i++) cout<<res[i]-1<<' '; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...