Submission #515859

#TimeUsernameProblemLanguageResultExecution timeMemory
515859JooRMQ (NOI17_rmq)C++17
100 / 100
71 ms11648 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+10;

int n, Q, Li[N], Lu[N], Ri[N], Ru[N], ans[N];
set<int> rem_pos, rem_val;

void ex(){
    for(int i = 0; i < n; i++) cout << "-1 ";
    exit(0);
}

int main(void){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> Q;
    for(int i = 0; i < n; i++){
        Li[i] = Ru[i] = -1e9;
        Lu[i] = Ri[i] = 1e9;        
        rem_pos.insert(i);
        rem_val.insert(i);
    }

    for(int i = 0; i < Q; i++){
        int l, r, x; cin >> l >> r >> x;
        Li[x] = max(Li[x], l), Ri[x] = min(Ri[x], r);
        Lu[x] = min(Lu[x], l), Ru[x] = max(Ru[x], r);
    }    

    for(int i = n-1; i >= 0; i--){
        if(Li[i] == -1e9) continue;
        if(Li[i] > Ri[i]) ex();
        
        auto itp = rem_pos.lower_bound(Li[i]);
        if(itp == rem_pos.end() or *itp > Ri[i]) ex();

        ans[*itp] = i;
        rem_pos.erase(itp), rem_val.erase(i);

        while(!rem_pos.empty()){
            itp = rem_pos.lower_bound(Lu[i]);
            if(itp == rem_pos.end() or *itp > Ru[i]) break;

            int v = *(rem_val.rbegin());
            if(v < i) ex();

            ans[*itp] = v;
            rem_pos.erase(itp), rem_val.erase(v);
        }
    }

    while(!rem_pos.empty()){
        ans[*(rem_pos.begin())] = *rem_val.begin();
        rem_pos.erase(rem_pos.begin()), rem_val.erase(rem_val.begin());
    }

    for(int i = 0; i < n; i++) cout << ans[i] << " ";
    cout << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...