#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |