#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <unordered_map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
#define ll long long
#define ld long double
#define inf (ll)(2*1e18)
#define sort(a) sort(a.begin(), a.end())
#define reverse(a) reverse(a.begin(), a.end())
#define pb push_back
#define endl "\n"
using namespace std;
void build(ll id, ll l, ll r, vector<ll>& a, vector<ll>& b){
if(l == r){
b[id] = a[l];
return;
}
ll m = (l+r)/2;
build(2*id, l, m, a, b);
build(2*id+1, m+1, r, a, b);
b[id] = min(b[2*id], b[2*id+1]);
}
ll get(ll id, ll l, ll r, ll tl, ll tr, vector<ll>& b){
if(r < tl or tr < l) return inf;
if(tl <= l and r <= tr){
return b[id];
}
ll m = (l+r)/2;
return min(get(2*id, l, m, tl, tr, b), get(2*id+1, m+1, r, tl, tr, b));
}
bool check(ll n, vector<ll>& ans, vector<vector<pair<ll, ll>>>& a){
vector<ll> b(4*n);
build(1, 0, n-1, ans, b);
for(int i=0;i<n;++i){
for(auto [l, r]: a[i]){
if(get(1, 0, n-1, l, r, b) != i){
return false;
}
}
}
return true;
}
pair<ll, ll> lower(pair<ll, ll> a, pair<ll, ll> b){
return {max(a.first, b.first), min(a.second, b.second)};
}
void solve(){
ll n, q, i, l, r, res, x;
cin>>n>>q;
vector<vector<pair<ll, ll>>> a(n);
vector<set<ll>> b(n);
vector<vector<ll>> open(n);
vector<vector<ll>> close(n);
vector<ll> ans(n);
multiset<ll> s;
set<ll> left;
for(i=0;i<q;++i){
cin>>l>>r>>res;
a[res].pb({l, r});
open[l].pb(res);
close[r].pb(res);
}
s.insert(0);
for(i=0;i<n;++i){
left.insert(i);
for(auto el: open[i]){
s.insert(el);
}
ans[i] = *s.rbegin();
for(auto el: close[i]){
s.erase(s.find(el));
}
}
if(check(n, ans, a)){
for(i=0;i<n;++i){
b[ans[i]].insert(i);
ans[i] = -1;
}
for(i=0;i<n;++i){
pair<ll, ll> p = {-1, n};
for(auto el: a[i]){
p = lower(p, el);
}
if(p.first != -1){
if(p.second < p.first){
for(i=0;i<n;++i){
cout<<-1<<' ';
}
cout<<endl;
return;
}
if(b[i].lower_bound(p.first) == b[i].end()){
for(i=0;i<n;++i){
cout<<-1<<' ';
}
cout<<endl;
return;
}
x = *b[i].lower_bound(p.first);
if(x > p.second){
for(i=0;i<n;++i){
cout<<-1<<' ';
}
cout<<endl;
return;
}
b[i].erase(x);
ans[x] = i;
left.erase(i);
}
}
for(i=n-1;i>=0;--i){
for(auto el: b[i]){
if(*left.rbegin() < i){
for(i=0;i<n;++i){
cout<<-1<<' ';
}
cout<<endl;
return;
}
ans[el] = *left.rbegin();
left.erase(*left.rbegin());
}
}
for(i=0;i<n;++i){
cout<<ans[i]<<' ';
}
cout<<endl;
}else{
for(i=0;i<n;++i){
cout<<-1<<' ';
}
cout<<endl;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
srand(time(nullptr));
ll t=1;
// cin>>t;
for(;t>0;--t){
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |