Submission #1139386

#TimeUsernameProblemLanguageResultExecution timeMemory
1139386WarinchaiRMQ (NOI17_rmq)C++20
0 / 100
0 ms320 KiB
#include<bits/stdc++.h>
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;
int vis[100005];
int ans[100005];
vector<int>lft;
map<int,int>have;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,q;cin>>n>>q;
    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++;
        tr.upd(1,n,1,st,en,x);
        //tr.print(1,n,1);
        //cerr<<"\n";
        have[x]++;
    }
    //cerr<<"work\n";
    vector<pair<int,int>>pos;
    for(int i=1;i<=n;i++){
        int x=tr.fans(1,n,1,i);
        if(x!=0&&!vis[x])ans[i-1]=x-1,vis[x]=1;
        else pos.push_back({x,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);
        }
    }
    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;
        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...