#ifdef LOCAL #define _GLIBCXX_DEBUG #endif #include using namespace std; #if __has_include() #include using namespace atcoder; #endif #pragma region Macros // rep macro #define foa(v, a) for(auto &v : a) #define REPname(a, b, c, d, e, ...) e #define REP(...) REPname(__VA_ARGS__, REP3, REP2, REP1, REP0)(__VA_ARGS__) #define REP0(x) for(int i = 0; i < (x); ++i) #define REP1(i, x) for(int i = 0; i < (x); ++i) #define REP2(i, l, r) for(int i = (l); i < (r); ++i) #define REP3(i, l, r, c) for(int i = (l); i < (r); i += (c)) #define REPSname(a, b, c, ...) c #define REPS(...) REPSname(__VA_ARGS__, REPS1, REPS0)(__VA_ARGS__) #define REPS0(x) for(int i = 1; i <= (x); ++i) #define REPS1(i, x) for(int i = 1; i <= (x); ++i) #define RREPname(a, b, c, d, e, ...) e #define RREP(...) RREPname(__VA_ARGS__, RREP3, RREP2, RREP1, RREP0)(__VA_ARGS__) #define RREP0(x) for(int i = (x)-1; i >= 0; --i) #define RREP1(i, x) for(int i = (x)-1; i >= 0; --i) #define RREP2(i, l, r) for(int i = (r)-1; i >= (l); --i) #define RREP3(i, l, r, c) for(int i = (r)-1; i >= (l); i -= (c)) #define RREPSname(a, b, c, ...) c #define RREPS(...) RREPSname(__VA_ARGS__, RREPS1, RREPS0)(__VA_ARGS__) #define RREPS0(x) for(int i = (x); i >= 1; --i) #define RREPS1(i, x) for(int i = (x); i >= 1; --i) // name macro #define fi first #define se second #define pb push_back #define eb emplace_back #define SZ(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define popcnt(x) __builtin_popcountll(x) template using V = std::vector; template using VV = std::vector>; template using VVV = std::vector>>; template using pqup = std::priority_queue, std::greater>; using ll = long long; using ld = long double; using int128 = __int128_t; using pii = std::pair; using pll = std::pair; using Tp = tuple; // input macro template std::istream &operator>>(std::istream &is, std::pair &p) { is >> p.first >> p.second; return is; } template std::istream &operator>>(std::istream &is, std::vector &v) { for(T &i : v) is >> i; return is; } std::istream &operator>>(std::istream &is, __int128_t &a) { std::string s; is >> s; __int128_t ret = 0; for(int i = 0; i < s.length(); i++) if('0' <= s[i] and s[i] <= '9') ret = 10 * ret + s[i] - '0'; a = ret * (s[0] == '-' ? -1 : 1); return is; } namespace scanner { void scan(int &a) { std::cin >> a; } void scan(long long &a) { std::cin >> a; } void scan(std::string &a) { std::cin >> a; } void scan(char &a) { std::cin >> a; } void scan(char a[]) { std::scanf("%s", a); } void scan(double &a) { std::cin >> a; } void scan(long double &a) { std::cin >> a; } template void scan(std::pair &p) { std::cin >> p; } template void scan(std::vector &a) { std::cin >> a; } void INPUT() {} template void INPUT(Head &head, Tail &... tail) { scan(head); INPUT(tail...); } } // namespace scanner #define VEC(type, name, size) \ std::vector name(size); \ scanner::INPUT(name) #define VVEC(type, name, h, w) \ std::vector> name(h, std::vector(w)); \ scanner::INPUT(name) #define INT(...) \ int __VA_ARGS__; \ scanner::INPUT(__VA_ARGS__) #define LL(...) \ long long __VA_ARGS__; \ scanner::INPUT(__VA_ARGS__) #define STR(...) \ std::string __VA_ARGS__; \ scanner::INPUT(__VA_ARGS__) #define CHAR(...) \ char __VA_ARGS__; \ scanner::INPUT(__VA_ARGS__) #define DOUBLE(...) \ double __VA_ARGS__; \ scanner::INPUT(__VA_ARGS__) #define LD(...) \ long double __VA_ARGS__; \ scanner::INPUT(__VA_ARGS__) // output-macro template std::ostream &operator<<(std::ostream &os, const std::pair &p) { os << p.first << " " << p.second; return os; } template std::ostream &operator<<(std::ostream &os, const std::vector &a) { for(int i = 0; i < int(a.size()); ++i) { if(i) os << " "; os << a[i]; } return os; } std::ostream &operator<<(std::ostream &dest, __int128_t &value) { std::ostream::sentry s(dest); if(s) { __uint128_t tmp = value < 0 ? -value : value; char buffer[128]; char *d = std::end(buffer); do { --d; *d = "0123456789"[tmp % 10]; tmp /= 10; } while(tmp != 0); if(value < 0) { --d; *d = '-'; } int len = std::end(buffer) - d; if(dest.rdbuf()->sputn(d, len) != len) { dest.setstate(std::ios_base::badbit); } } return dest; } template void print(const T a) { std::cout << a << '\n'; } template void print(Head H, Tail... T) { std::cout << H << ' '; print(T...); } template void printel(const T a) { std::cout << a << '\n'; } template void printel(const std::vector &a) { for(const auto &v : a) std::cout << v << '\n'; } template void printel(Head H, Tail... T) { std::cout << H << '\n'; printel(T...); } void Yes(const bool b = true) { std::cout << (b ? "Yes\n" : "No\n"); } void No() { std::cout << "No\n"; } void YES(const bool b = true) { std::cout << (b ? "YES\n" : "NO\n"); } void NO() { std::cout << "No\n"; } void err(const bool b = true) { if(b) { std::cout << "-1\n", exit(0); } } //debug macro namespace debugger { template void view(const std::vector &a) { std::cerr << "{ "; for(const auto &v : a) { std::cerr << v << ", "; } std::cerr << "\b\b }"; } template void view(const std::vector> &a) { std::cerr << "{\n"; for(const auto &v : a) { std::cerr << "\t"; view(v); std::cerr << "\n"; } std::cerr << "}"; } template void view(const std::vector> &a) { std::cerr << "{\n"; for(const auto &p : a) std::cerr << "\t(" << p.first << ", " << p.second << ")\n"; std::cerr << "}"; } template void view(const std::map &m) { std::cerr << "{\n"; for(const auto &p : m) std::cerr << "\t[" << p.first << "] : " << p.second << "\n"; std::cerr << "}"; } template void view(const std::pair &p) { std::cerr << "(" << p.first << ", " << p.second << ")"; } template void view(const std::set &s) { std::cerr << "{ "; for(auto &v : s) { view(v); std::cerr << ", "; } std::cerr << "\b\b }"; } template void view(const T &e) { std::cerr << e; } } // namespace debugger #ifdef LOCAL void debug_out() {} template void debug_out(Head H, Tail... T) { debugger::view(H); std::cerr << ", "; debug_out(T...); } #define debug(...) \ do { \ std::cerr << __LINE__ << " [" << #__VA_ARGS__ << "] : ["; \ debug_out(__VA_ARGS__); \ std::cerr << "\b\b]\n"; \ } while(false) #else #define debug(...) (void(0)) #endif // vector macro template int lb(const std::vector &a, const T x) { return std::distance((a).begin(), std::lower_bound((a).begin(), (a).end(), (x))); } template int ub(const std::vector &a, const T x) { return std::distance((a).begin(), std::upper_bound((a).begin(), (a).end(), (x))); } template void UNIQUE(std::vector &a) { std::sort(a.begin(), a.end()); a.erase(std::unique(a.begin(), a.end()), a.end()); } template std::vector press(std::vector &a) { auto res = a; UNIQUE(res); for(auto &v : a) v = lb(res, v); return res; } #define SORTname(a, b, c, ...) c #define SORT(...) SORTname(__VA_ARGS__, SORT1, SORT0, ...)(__VA_ARGS__) #define SORT0(a) std::sort((a).begin(), (a).end()) #define SORT1(a, c) std::sort((a).begin(), (a).end(), [](const auto x, const auto y) { return x c y; }) template void ADD(std::vector &a, const T x) { for(auto &v : a) v += x; } template void SUB(std::vector &a, const T x = 1) { for(auto &v : a) v -= x; } template void MUL(std::vector &a, const T x) { for(auto &v : a) v *= x; } template void DIV(std::vector &a, const T x) { for(auto &v : a) v /= x; } // math macro template inline bool chmin(T &a, const U &b) { return a > b ? a = b, true : false; } template inline bool chmax(T &a, const U &b) { return a < b ? a = b, true : false; } template T divup(T x, T y) { return (x + y - 1) / y; } template T POW(T a, long long n) { T ret = 1; while(n) { if(n & 1) ret *= a; a *= a; n >>= 1; } return ret; } template T ADD(T a, T b){ T res; return __builtin_add_overflow(a, b, &res) ? numeric_limits::max() : res; } template T MUL(T a, T b){ T res; return __builtin_mul_overflow(a, b, &res) ? numeric_limits::max() : res; } // modpow long long POW(long long a, long long n, const int mod) { long long ret = 1; while(n) { if(n & 1) (ret *= a) %= mod; (a *= a) %= mod; n >>= 1; } return ret; } // others struct fast_io { fast_io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); } } fast_io_; #pragma endregion using R = long double; constexpr R EPS=1E-11; // r の(誤差付きの)符号に従って, -1, 0, 1 を返す. int sgn(const R& r){ return (r > EPS) - (r < -EPS); } // a, b の(誤差付きの)大小比較の結果に従って, -1, 0, 1 を返す. int sgn(const R& a, const R &b){ return sgn(a-b); } // a > 0 は sgn(a) > 0 // a < b は sgn(a, b) < 0 // a >= b は sgn(a, b) >= 0 // のように書く. // return s * 10^n //https://atcoder.jp/contests/abc191/submissions/20028529 long long x10(const string& s, size_t n) { if (s.front() == '-') return -x10(s.substr(1), n); auto pos = s.find('.'); if (pos == string::npos) return stoll(s + string(n, '0')); return stoll(s.substr(0, pos) + s.substr(pos + 1) + string(n + pos + 1 - s.size(), '0')); } long long ceildiv(long long a, long long b) { if (b < 0) a = -a, b = -b; if (a >= 0) return (a + b - 1) / b; else return a / b; } long long floordiv(long long a, long long b) { if (b < 0) a = -a, b = -b; if (a >= 0) return a / b; else return (a - b + 1) / b; } long long floorsqrt(long long x) { assert(x >= 0); long long ok = 0; long long ng = 1; while (ng * ng <= x) ng <<= 1; while (ng - ok > 1) { long long mid = (ng + ok) >> 1; if (mid * mid <= x) ok = mid; else ng = mid; } return ok; } inline int topbit(unsigned long long x){ return x?63-__builtin_clzll(x):-1; } inline int popcount(unsigned long long x){ return __builtin_popcountll(x); } inline int parity(unsigned long long x){//popcount%2 return __builtin_parity(x); } const int inf = 1e9; const ll INF = 1e18; template struct SegmentTreeBeats { private: size_t n, n_; const T MAX = std::numeric_limits::max(); const T MIN = -MAX; std::vector max_v, min_v, smax_v, smin_v, lz_upd, lz_ad, sigm, len; std::vector max_c, min_c; void init(std::vector &v) { n_ = v.size(), n = 1; while(n < n_) n *= 2; max_v.assign(n * 2 - 1, MIN); min_v.assign(n * 2 - 1, MAX); smax_v.assign(n * 2 - 1, MIN); smin_v.assign(n * 2 - 1, MAX); lz_upd.assign(n * 2 - 1, MAX); lz_ad.assign(n * 2 - 1, 0); len.assign(n * 2 - 1, n); sigm.assign(n * 2 - 1, 0); max_c.assign(n * 2 - 1, 1); min_c.assign(n * 2 - 1, 1); for(int i = 0; i < n - 1; i++) len[i * 2 + 1] = len[i * 2 + 2] = (len[i] >> 1); for(int i = 0; i < n_; i++) max_v[i + n - 1] = min_v[i + n - 1] = sigm[i + n - 1] = v[i]; for(int i = n - 2; i >= 0; i--) proc(i); } void proc(int i) { sigm[i] = sigm[i * 2 + 1] + sigm[i * 2 + 2]; max_v[i] = std::max(max_v[i * 2 + 1], max_v[i * 2 + 2]); if(max_v[i * 2 + 1] > max_v[i * 2 + 2]) { max_c[i] = max_c[i * 2 + 1]; smax_v[i] = std::max(smax_v[i * 2 + 1], max_v[i * 2 + 2]); } if(max_v[i * 2 + 1] < max_v[i * 2 + 2]) { max_c[i] = max_c[i * 2 + 2]; smax_v[i] = std::max(max_v[i * 2 + 1], smax_v[i * 2 + 2]); } if(max_v[i * 2 + 1] == max_v[i * 2 + 2]) { max_c[i] = max_c[i * 2 + 1] + max_c[i * 2 + 2]; smax_v[i] = std::max(smax_v[i * 2 + 1], smax_v[i * 2 + 2]); } min_v[i] = std::min(min_v[i * 2 + 1], min_v[i * 2 + 2]); if(min_v[i * 2 + 1] < min_v[i * 2 + 2]) { min_c[i] = min_c[i * 2 + 1]; smin_v[i] = std::min(smin_v[i * 2 + 1], min_v[i * 2 + 2]); } if(min_v[i * 2 + 1] > min_v[i * 2 + 2]) { min_c[i] = min_c[i * 2 + 2]; smin_v[i] = std::min(min_v[i * 2 + 1], smin_v[i * 2 + 2]); } if(min_v[i * 2 + 1] == min_v[i * 2 + 2]) { min_c[i] = min_c[i * 2 + 1] + min_c[i * 2 + 2]; smin_v[i] = std::min(smin_v[i * 2 + 1], smin_v[i * 2 + 2]); } } void eval(int i) { if(lz_upd[i] != MAX) { in_update(i * 2 + 1, lz_upd[i]); in_update(i * 2 + 2, lz_upd[i]); lz_upd[i] = MAX; return; } if(lz_ad[i]) { in_add(i * 2 + 1, lz_ad[i]); in_add(i * 2 + 2, lz_ad[i]); lz_ad[i] = 0; } if(max_v[i] < max_v[i * 2 + 1]) in_chmin(i * 2 + 1, max_v[i]); if(max_v[i] < max_v[i * 2 + 2]) in_chmin(i * 2 + 2, max_v[i]); if(min_v[i] > min_v[i * 2 + 1]) in_chmax(i * 2 + 1, min_v[i]); if(min_v[i] > min_v[i * 2 + 2]) in_chmax(i * 2 + 2, min_v[i]); } void in_update(int i, T x) { max_v[i] = min_v[i] = x; smax_v[i] = MIN, smin_v[i] = MAX; max_c[i] = min_c[i] = len[i]; sigm[i] = len[i] * x; lz_upd[i] = x, lz_ad[i] = 0; } void in_chmin(int i, T x) { sigm[i] += (x - max_v[i]) * max_c[i]; if(max_v[i] == min_v[i]) max_v[i] = min_v[i] = x; else if(max_v[i] == smin_v[i]) max_v[i] = smin_v[i] = x; else max_v[i] = x; if(lz_upd[i] != MAX and lz_upd[i] > x) lz_upd[i] = x; } void in_chmax(int i, T x) { sigm[i] += (x - min_v[i]) * min_c[i]; if(min_v[i] == max_v[i]) min_v[i] = max_v[i] = x; else if(min_v[i] == smax_v[i]) min_v[i] = smax_v[i] = x; else min_v[i] = x; if(lz_upd[i] != MAX and lz_upd[i] < x) lz_upd[i] = x; } void in_add(int i, T x) { max_v[i] += x, min_v[i] += x; if(smin_v[i] != MAX) smin_v[i] += x; if(smax_v[i] != MIN) smax_v[i] += x; sigm[i] += x * len[i]; if(lz_upd[i] != MAX) lz_upd[i] += x; lz_ad[i] += x; } void chmin(int i, int a, int b, int l, int r, T x) { if(b <= l or r <= a or x >= max_v[i]) return; if(a <= l and r <= b and smax_v[i] < x) { in_chmin(i, x); return; } eval(i); chmin(i * 2 + 1, a, b, l, (l + r) >> 1, x); chmin(i * 2 + 2, a, b, (l + r) >> 1, r, x); proc(i); } void chmax(int i, int a, int b, int l, int r, T x) { if(b <= l or r <= a or x <= min_v[i]) return; if(a <= l and r <= b and smin_v[i] > x) { in_chmax(i, x); return; } eval(i); chmax(i * 2 + 1, a, b, l, (l + r) >> 1, x); chmax(i * 2 + 2, a, b, (l + r) >> 1, r, x); proc(i); } void add(int i, int a, int b, int l, int r, T x) { if(b <= l or r <= a) return; if(a <= l and r <= b) { in_add(i, x); return; } eval(i); add(i * 2 + 1, a, b, l, (l + r) >> 1, x); add(i * 2 + 2, a, b, (l + r) >> 1, r, x); proc(i); } void update(int i, int a, int b, int l, int r, T x) { if(b <= l or r <= a) return; if(a <= l and r <= b) { in_update(i, x); return; } eval(i); update(i * 2 + 1, a, b, l, (l + r) >> 1, x); update(i * 2 + 2, a, b, (l + r) >> 1, r, x); proc(i); } T sum(int i, int a, int b, int l, int r) { if(r <= a || b <= l) return 0; if(a <= l && r <= b) return sigm[i]; eval(i); T lv = sum(i * 2 + 1, a, b, l, (l + r) / 2); T rv = sum(i * 2 + 2, a, b, (l + r) / 2, r); return lv + rv; } T rangemin(int i, int a, int b, int l, int r) { if(r <= a or b <= l) return MAX; if(a <= l and r <= b) return min_v[i]; eval(i); T lv = rangemin(i * 2 + 1, a, b, l, (l + r) >> 1); T rv = rangemin(i * 2 + 2, a, b, (l + r) >> 1, r); return std::min(lv, rv); } T rangemax(int i, int a, int b, int l, int r) { if(r <= a or b <= l) return MIN; if(a <= l and r <= b) return max_v[i]; eval(i); T lv = rangemax(i * 2 + 1, a, b, l, (l + r) >> 1); T rv = rangemax(i * 2 + 2, a, b, (l + r) >> 1, r); return std::max(lv, rv); } T rangesum(int i, int a, int b, int l, int r) { if(r <= a or b <= l) return 0; if(a <= l and r <= b) return sigm[i]; eval(i); T lv = rangesum(i * 2 + 1, a, b, l, (l + r) >> 1); T rv = rangesum(i * 2 + 2, a, b, (l + r) >> 1, r); return lv + rv; } public: SegmentTreeBeats() = default; SegmentTreeBeats(std::vector &v) { init(v); } SegmentTreeBeats(size_t n, T init_data = 0) { std::vector v(n, init_data); init(v); } T operator[](int i) { return query_min(i, i + 1); } void update_chmin(int a, int b, T x) { chmin(0, a, b, 0, n, x); } void update_chmax(int a, int b, T x) { chmax(0, a, b, 0, n, x); } void update_add(int a, int b, T x) { add(0, a, b, 0, n, x); } void update_upd(int a, int b, T x) { update(0, a, b, 0, n, x); } T query_min(int a, int b) { return rangemin(0, a, b, 0, n); } T query_max(int a, int b) { return rangemax(0, a, b, 0, n); } T query_sum(int a, int b) { return rangesum(0, a, b, 0, n); } }; #pragma endregion void main_() { LL(N,Q); V> T(Q); REP(i,Q){ cin >> T[i].se.fi >> T[i].se.se >> T[i].fi; T[i].se.fi--; } V ans(N,1); SegmentTreeBeats beats(ans); sort(all(T)); REP(i,Q){ beats.update_chmax(T[i].se.fi,T[i].se.se,T[i].fi); } bool ok = true; REP(i,Q){ ll mn = beats.query_min(T[i].se.fi,T[i].se.se); if(mn != T[i].fi)ok = false; } if(ok){ REP(i,N){ ll val = beats.query_min(i,i+1); if(i)cout << " "; cout << val; } cout << endl; } else cout << -1 << endl; } int main() { int t = 1; //cin >> t; while(t--) main_(); return 0; }