Submission #1164910

#TimeUsernameProblemLanguageResultExecution timeMemory
1164910fryingducEvent Hopping 2 (JOI21_event2)C++20
100 / 100
121 ms22164 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 1e5 + 5;
const int N = 2e5 + 5;
const int LG = 18;
int n, k, l[maxn], r[maxn];
int up[N][LG + 1];

void solve() {
  cin >> n >> k;
  vector<int> compress;
  for (int i = 1; i <= n; ++i) {
    cin >> l[i] >> r[i];
    compress.push_back(l[i]);
    compress.push_back(r[i]);
  }
  sort(compress.begin(), compress.end());
  compress.erase(unique(compress.begin(), compress.end()), compress.end());
  int m = (int)compress.size();
  for (int i = 1; i <= m + 1; ++i) {
    up[i][0] = m + 1;
  }
  for (int i = 1; i <= n; ++i) {
    l[i] = lower_bound(compress.begin(), compress.end(), l[i]) - compress.begin() + 1;
    r[i] = lower_bound(compress.begin(), compress.end(), r[i]) - compress.begin() + 1;
    up[l[i]][0] = min(up[l[i]][0], r[i]);
  }
  for (int i = m; i; --i) {
    up[i][0] = min(up[i][0], up[i + 1][0]);
  }
  for (int i = 1; i <= LG; ++i) {
    for (int u = 1; u <= m + 1; ++u) {
      up[u][i] = up[up[u][i - 1]][i - 1];
    }
  }
  set<pair<int, int>> s;
  auto valid_insert = [&](int cl, int cr) {
    auto it = s.lower_bound(make_pair(cl, cr));
    if (it != s.end() and it->first < cr) return 0;
    if (it != s.begin() and prev(it)->second > cl) return 0;
    return 1;
  };
  auto calc = [&](int l, int r) {
    int res = 0;
    for (int i = LG; i >= 0; --i) {
      if (up[l][i] <= r) {
        res += (1 << i);
        l = up[l][i];
      }
    }
    return res;
  };
  int res = calc(1, m);
  if (res < k) {
    cout << -1;
    return;
  }
  vector<int> cand;
  for (int i = 1; i <= n; ++i) {
    if ((int)cand.size() == k) break;
//    debug(l[i], r[i]);
    if (!valid_insert(l[i], r[i])) continue;
    auto it = s.lower_bound(make_pair(l[i], r[i]));
    int br = (it == s.end() ? m : it->first);
    int bl = (it == s.begin() ? 1 : prev(it)->second);
    int cur = res - calc(bl, br) + calc(bl, l[i]) + calc(r[i], br);
//    debug(bl, l[i], r[i], br);
//    debug(cur, calc(bl, br), calc(bl, l[i]), calc(r[i], br));
    if (cur + 1 >= k - (int)cand.size()) {
      s.insert(make_pair(l[i], r[i]));
      cand.push_back(i);
      res = cur;
    }
  }
  for (auto i:cand) cout << i << '\n';
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...