Submission #1226552

#TimeUsernameProblemLanguageResultExecution timeMemory
1226552lopkusRMQ (NOI17_rmq)C++20
0 / 100
0 ms324 KiB
#include <bits/stdc++.h>

int main() {

  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int n, q;
  std::cin >> n >> q;
  std::vector<int> l(q + 1), r(q + 1), x(q + 1);
  for(int i = 1; i <= q; i++) {
    std::cin >> l[i] >> r[i] >> x[i];
    l[i] += 1;
    r[i] += 1;
    x[i] += 1;
  }
  std::vector<int> b(n + 1, 1);
  for(int i = 1; i <= q; i++) {
    for(int j = l[i]; j <= r[i]; j++) {
      b[j] = std::max(b[j], x[i]);
    }
  }
  std::vector<std::pair<int, int>> intervals[n + 1];
  for(int i = 1; i <= q; i++) {
    intervals[x[i]].push_back({l[i], r[i]});
  }
  std::vector<std::pair<int, int>> Do[n + 1];
  int can = 1;
  for(int it = 1; it <= n; it++) {
    int L = - 1, R = n + 1;
    for(auto [ll, rr] : intervals[it]) {
      L = std::max(L, ll);
      R = std::min(R, rr);
    }
    if(L > R) {
      can = 0;
      break;
    }
    Do[L].push_back({R, it});
  }
  if(!can) {
    for(int i = 1; i <= n; i++) {
      std::cout << - 1 << " ";
    }
    return 0;
  }
  std::vector<int> any(n + 1);
  std::vector<int> a(n + 1, - 1);
  for(int i = 1; i <= n; i++) {
    std::sort(Do[i].begin(), Do[i].end());
    for(auto [rr, xx] : Do[i]) {
      for(int j = i; j <= rr; j++) {
        if(!any[j] && b[j] <= xx) {
          any[j] = 1;
          a[j] = xx;
          break;
        }
      }
    }
  }
  std::vector<int> was(n + 1);
  for(int i = 1; i <= n; i++) {
    if(a[i] != - 1) {
      was[a[i]] = 1;
    }
  }
  int curr = n;
  std::vector<std::pair<int, int>> other;
  for(int i = 1; i <= n; i++) {
    if(a[i] == - 1) {
      other.push_back({b[i], i});
    }
  }
  std::sort(other.rbegin(), other.rend());
  for(int it = 0; it < other.size(); it++) {
    while(was[curr]) {
      curr--;
    }
    if(b[other[it].second] > curr) {
      can = 0;
      break;
    }
    a[other[it].second] = curr--;
  }
  if(!can) {
    for(int i = 1; i <= n; i++) {
      std::cout << - 1 << " ";
    }
    return 0;
  }
  for(int i = 1; i <= q; i++) {
    int mn = n + 1;
    for(int j = l[i]; j <= r[i]; j++) {
      mn = std::min(mn, a[j]);
    }
    if(mn != x[i]) {
      can = 0;
    }
  }
  if(!can) {
    for(int i = 1; i <= n; i++) {
      std::cout << - 1 << " ";
    }
    return 0;
  }
  for(int i = 1; i <= n; i++) {
    std::cout << --a[i] << " ";
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...