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...