Submission #871934

#TimeUsernameProblemLanguageResultExecution timeMemory
871934tvladm2009Event Hopping 2 (JOI21_event2)C++17
100 / 100
210 ms37332 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = (int) 1e5 + 7;
const int K = 20;
pair<int, int> a[N];
int mx[2 * N], l[2 * N], dp[2 * N];
int tab[K][2 * N];
int n, k;

void build() {
  for (int i = 1; i <= 2 * n; i++) {
    tab[0][i] = l[i];
  }
  for (int k = 1; k < K; k++) {
    for (int i = 1; i <= 2 * n; i++) {
      tab[k][i] = tab[k - 1][tab[k - 1][i]];
    }
  }
}

int lift(int a, int x) {
  for (int k = 0; k < K; k++) {
    if (x & (1 << k)) {
      a = tab[k][a];
    }
  }
  return a;
}

bool check(int l, int r, int val) {
  if (val <= 0) {
    return true;
  }
  int nxt = lift(r, val);
  if (nxt != 2 * n && nxt >= l) {
    return true;
  } else {
    return false;
  }
}

int get(int l, int r) {
  return dp[r] - dp[l] - !check(l, r, dp[r] - dp[l]);
}

int main() {
#ifdef ONPC
  freopen("input.txt", "r", stdin);
#else
  ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#endif // ONPC

  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].first >> a[i].second;
  }

  {
    set<int> vals;
    unordered_map<int, int> mp;
    for (int i = 1; i <= n; i++) {
      vals.insert(a[i].first);
      vals.insert(a[i].second);
    }
    int id = 1;
    for (auto it = vals.begin(); it != vals.end(); it++) {
      mp[*it] = id;
      id++;
    }
    for (int i = 1; i <= n; i++) {
      a[i].first = mp[a[i].first];
      a[i].second = mp[a[i].second];
    }
  }

  for (int i = 1; i <= 2 * n; i++) {
    mx[i] = -1;
    l[i] = 2 * n;
  }
  for (int i = 1; i <= n; i++) {
    mx[a[i].second] = max(mx[a[i].second], a[i].first);
  }
  int cur = -1;
  for (int i = 1; i <= 2 * n; i++) {
    cur = max(cur, mx[i]);
    if (cur != -1) {
      l[i] = cur;
    }
  }
  for (int i = 1; i <= 2 * n; i++) {
    if (l[i] == 2 * n) {
      dp[i] = 0;
    } else {
      dp[i] = dp[l[i]] + 1;
    }
  }

  if (dp[2 * n] < k) {
    cout << "-1\n";
    return 0;
  }
  build();
  int maxsum = dp[2 * n];
  set<pair<int, int>> free;
  vector<int> sol;
  free.insert({1, 2 * n});
  for (int i = 1; i <= n; i++) {
    if ((int) sol.size() == k) {
      break;
    }
    int l = a[i].first, r = a[i].second;
    auto it = free.lower_bound({a[i].first + 1, 0});
    if (it == free.begin()) {
      continue;
    }
    it--;
    if (it->second < r) {
      continue;
    }
    int ll = it->first, rr = it->second;
    int before = get(ll, rr);
    int after = get(ll, l) + get(r, rr) + 1;
    if (maxsum + after - before >= k) {
      sol.push_back(i);
      free.erase(it);
      if (l > ll) {
        free.insert({ll, l});
      }
      if (r < rr) {
        free.insert({r, rr});
      }
      maxsum += after - before;
    } else {
      continue;
    }
  }
  for (auto &it : sol) {
    cout << it << "\n";
  }
  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...