Submission #1139409

#TimeUsernameProblemLanguageResultExecution timeMemory
1139409WarinchaiRMQ (NOI17_rmq)C++20
0 / 100
1 ms320 KiB
#include<bits/stdc++.h> #define int long long using namespace std; int l[100005]; int r[100005]; int inf=1e6; struct segtree{ int info[400005]; int lz[400005]; void push(int st,int en,int i){ if(lz[i]==0)return; if(st==en)info[i]=max(lz[i],info[i]); else lz[i*2]=max(lz[i],lz[i*2]),lz[i*2+1]=max(lz[i],lz[i*2+1]); lz[i]=0; } void upd(int st,int en,int i,int l,int r,int val){ push(st,en,i); if(st>r||en<l)return; if(st>=l&&en<=r)return lz[i]=val,push(st,en,i); int m=(st+en)/2; upd(st,m,i*2,l,r,val); upd(m+1,en,i*2+1,l,r,val); info[i]=max(info[i*2],info[i*2+1]); } int fans(int st,int en,int i,int pos){ push(st,en,i); if(st==en)return info[i]; int m=(st+en)/2; if(pos<=m)return fans(st,m,i*2,pos); return fans(m+1,en,i*2+1,pos); } void print(int st,int en,int i){ push(st,en,i); if(st==en)return void(cerr<<info[i]<<" "); int m=(st+en)/2; print(st,m,i*2); print(m+1,en,i*2+1); } }tr; struct segmin{ int info[400005]; int lz[400005]; void push(int st,int en,int i){ if(lz[i]==inf)return; if(st==en)info[i]=min(lz[i],info[i]); else lz[i*2]=min(lz[i],lz[i*2]),lz[i*2+1]=min(lz[i],lz[i*2+1]); lz[i]=inf; } void upd(int st,int en,int i,int l,int r,int val){ push(st,en,i); if(st>r||en<l)return; if(st>=l&&en<=r)return lz[i]=val,push(st,en,i); int m=(st+en)/2; upd(st,m,i*2,l,r,val); upd(m+1,en,i*2+1,l,r,val); info[i]=min(info[i*2],info[i*2+1]); } int fans(int st,int en,int i,int pos){ push(st,en,i); if(st==en)return info[i]; int m=(st+en)/2; if(pos<=m)return fans(st,m,i*2,pos); return fans(m+1,en,i*2+1,pos); } void print(int st,int en,int i){ push(st,en,i); if(st==en)return void(cerr<<info[i]<<" "); int m=(st+en)/2; print(st,m,i*2); print(m+1,en,i*2+1); } void build(int st,int en,int i){ lz[i]=inf; if(st==en)return info[i]=inf,void(); int m=(st+en)/2; build(st,m,i*2); build(m+1,en,i*2+1); info[i]=min(info[i*2],info[i*2+1]); } }tr2; int vis[100005]; int ans[100005]; vector<int>lft; map<int,int>have; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,q;cin>>n>>q; tr2.build(1,n,1); //tr2.print(1,n,1); //cerr<<"\n"; vector<pair<int,pair<int,int>>>v; for(int i=0;i<q;i++){ int st,en,x;cin>>st>>en>>x; st++,en++,x++; if(r[x]==0)l[x]=st,r[x]=en; else l[x]=max(l[x],st),r[x]=min(r[x],en); //cerr<<"upd:"<<st<<" "<<en<<" "<<x<<"\n"; tr2.upd(1,n,1,st,en,x); //tr2.print(1,n,1); //cerr<<"\n"; //tr.print(1,n,1); //cerr<<"\n"; have[x]++; } //cerr<<"work\n"; for(int i=1;i<=n;i++){ if(l[i]>r[i]){ //cerr<<"wrong ranges"; for(int i=1;i<=n;i++)cout<<-1<<" "; return 0; } if(l[i]!=0){ tr.upd(1,n,1,l[i],r[i],i); } } //tr.print(1,n,1); //cerr<<"\n"; //tr2.print(1,n,1); //cerr<<"\n"; vector<pair<int,int>>pos; for(int i=1;i<=n;i++){ int x=tr.fans(1,n,1,i); int y=tr2.fans(1,n,1,i); if(y==inf)y=0; if(x!=0&&!vis[x])ans[i-1]=x-1,vis[x]=1; else pos.push_back({y,i}); } for(auto x:have)if(vis[x.first]==0){ //cerr<<"covered\n"; for(int i=1;i<=n;i++)cout<<-1<<" "; return 0; } for(int i=1;i<=n;i++){ if(have[i]==0){ lft.push_back(i); //cerr<<"left:"<<i<<"\n"; } } sort(pos.begin(),pos.end()); //cerr<<"sz:"<<pos.size()<<lft.size()<<"\n"; for(int i=0;i<lft.size();i++){ ans[pos[i].second-1]=lft[i]-1; //cerr<<lft[i]<<" "<<pos[i].first<<" "<<pos[i].second<<"\n"; if(lft[i]<pos[i].first){ //cerr<<"too little\n"; for(int i=1;i<=n;i++)cout<<-1<<" "; return 0; } } for(int i=1;i<=n;i++)cout<<ans[i-1]<<" "; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...