제출 #1361596

#제출 시각아이디문제언어결과실행 시간메모리
1361596lyra_g13RMQ (NOI17_rmq)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
using ll = long long;
using namespace std;

class segtree {
public:
  ll n;
  std::vector<ll> seg;
  vector<ll> lazyadd;
  vector<ll> lazyset;
  vector<ll> hasset;

  segtree(ll n) : n(n), seg(4 * n + 5, 1e18), lazyadd(4 * n + 5), lazyset(4 * n + 5), hasset(4 * n + 5) {}

  void applyadd(ll v, ll add, ll len) {
    seg[v] += add;
    if (hasset[v]) {
      lazyset[v] += add;
    } else {
      lazyadd[v] += add;
    }
  }
  void applyset(ll v, ll newval, ll len) {
    seg[v] = newval;
    lazyset[v] = newval;
    lazyadd[v] = 0;
    hasset[v] = 1;
  }

  void push(ll v, ll l, ll r) {
    if (l == r)
      return;

    ll m = l + (r - l) / 2;
    ll leftlen = m - l + 1;
    ll rightlen = r - m;

    if (hasset[v]) {
      applyset(2 * v, lazyset[v], leftlen);
      applyset(2 * v + 1, lazyset[v], rightlen);
      hasset[v] = 0;
      lazyset[v] = 0;
    }
    if (lazyadd[v] != 0) {
      applyadd(2 * v, lazyadd[v], leftlen);
      applyadd(2 * v + 1, lazyadd[v], rightlen);

      lazyadd[v] = 0;
    }
  }

  void set(ll v, ll l, ll r, ll idx, ll del) {
    if (idx > r or idx < l) {
      return;
    }
    if (l == r) {
      seg[v] = del;
      lazyadd[v] = 0;
      lazyset[v] = 0;
      hasset[v] = 0;
      return;
    }
    push(v, l, r);
    ll m = l + (r - l) / 2;
    set(2 * v, l, m, idx, del);
    set(2 * v + 1, m + 1, r, idx, del);
    seg[v] = min(seg[2 * v], seg[2 * v + 1]);
  }

  void set(ll idx, ll del) {
    set(1, 0, n - 1, idx, del);
  }

  ll q(ll v, ll l, ll r, ll ql, ll qr) {
    if (qr < l or ql > r) {
      return 1e18;
    }
    if (ql <= l and r <= qr) {
      return seg[v];
    }
    push(v, l, r);
    ll m = l + (r - l) / 2;
    return min(q(2 * v, l, m, ql, qr), q(2 * v + 1, m + 1, r, ql, qr));
  }

  ll q(ll ql, ll qr) {
    return q(1, 0, n - 1, ql, qr);
  }

  void rangeadd(ll v, ll l, ll r, ll ql, ll qr, ll del) {
    if (qr < l or ql > r) {
      return;
    }
    if (ql <= l and r <= qr) {
      return applyadd(v, del, (r - l + 1));
    }
    push(v, l, r);
    ll m = l + (r - l) / 2;
    rangeadd(2 * v, l, m, ql, qr, del);
    rangeadd(2 * v + 1, m + 1, r, ql, qr, del);
    seg[v] = min(seg[2 * v], seg[2 * v + 1]);
  }

  void rangeadd(ll ql, ll qr, ll del) {
    return rangeadd(1, 0, n - 1, ql, qr, del);
  }
  void rangeset(ll v, ll l, ll r, ll ql, ll qr, ll del) {
    if (qr < l or ql > r) {
      return;
    }
    if (ql <= l and r <= qr) {
      return applyset(v, del, r - l + 1);
    }
    push(v, l, r);
    ll m = l + (r - l) / 2;
    rangeset(2 * v, l, m, ql, qr, del);
    rangeset(2 * v + 1, m + 1, r, ql, qr, del);
    seg[v] = min(seg[2 * v], seg[2 * v + 1]);
  }

  void rangeset(ll ql, ll qr, ll del) {
    return rangeset(1, 0, n - 1, ql, qr, del);
  }
};

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);
  ll n, q;
  cin >> n >> q;

  vector<pair<ll, pair<ll, ll>>> qu(q);

  for (int i = 0; i < q; i++) {
    cin >> qu[i].second.first >> qu[i].second.second >> qu[i].first;
  }

  sort(qu.begin(), qu.end());
  reverse(qu.begin(), qu.end());

  segtree st(n);
  for (int i = 0; i < n; i++) {
    st.set(i, 1e18);
  }

  for (int i = 0; i < q; i++) {
    auto [num, ra] = qu[i];
    auto [l, r] = ra;

    while (i + 1 < q and num == qu[i + 1].first) {
      auto [bnum, bra] = qu[i + 1];
      auto [bl, br] = bra;
      l = min(l, bl);
      r = max(r, br);
      i++;
    }

    st.rangeset(l, r, num);
  }

  ll check = 0;
  for (int i = 0; i < q; i++) {
    auto [num, ra] = qu[i];
    auto [l, r] = ra;
    if (st.q(l, r) == num)
      continue;
    else {
      check = 1;
      break;
    }
  }

  if (check == 1) {
    for (int i = 0; i < n; i++) {
      cout << -1 << " ";
    }
    return 0;
  }

  vector<ll> c(n, 1);
  ll counter = n - 1;
  vector<ll> a(n, 1e18);

  for (int i = 0; i < q; i++) {
    auto [num, ra] = qu[i];
    auto [l, r] = ra;

    ll ml = l, mr = r;
    while (i + 1 < q and num == qu[i + 1].first) {
      auto [bnum, bra] = qu[i + 1];
      auto [bl, br] = bra;
      l = min(l, bl);
      r = max(r, br);
      ml = max(l, bl);
      mr = min(r, br);
      i++;
    }

    a[ml] = num;
    c[num] = 0;
    for (int i = l; i <= r; i++) {
      if (a[i] != 1e18)
        continue;
      while (c[counter] == 0) {
        counter--;
      }
      if (counter < 0) {
        for (int i = 0; i < n; i++) {
          cout << -1 << " ";
        }
        return 0;
      }
      a[i] = counter;
      counter--;
    }
  }

  for (int i = 0; i < n; i++) {
    st.set(i, a[i]);
  }

  check = 0;
  for (int i = 0; i < q; i++) {
    auto [num, ra] = qu[i];
    auto [l, r] = ra;
    if (st.q(l, r) == num)
      continue;
    else {
      check = 1;
      break;
    }
  }

  if (check == 1) {
    for (int i = 0; i < n; i++) {
      cout << -1 << " ";
    }
    return 0;
  }

  for (auto i : a) {
    cout << i << " ";
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...