#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
#define int long long
#define fi first
#define se second
#define L(i, j, k) for (int i = (j); i <= (k); i++)
#define R(i, j, k) for (int i = (j); i >= (k); i--)
#define all(x) x.begin(), x.end()
const int LG = 18;
void solve() {
int n, k;
cin >> n >> k;
vector<int> l(n+1), r(n+1);
set<array<int, 3>> st;
vector<int> disc;
for (int i = 1; i <= n; i++) {
cin >> l[i] >> r[i];
disc.push_back(l[i]);
disc.push_back(r[i]);
}
sort(disc.begin(), disc.end());
disc.erase(unique(disc.begin(), disc.end()), disc.end());
int m = 0;
for (int i = 1; i <= n; i++) {
l[i] = lower_bound(disc.begin(), disc.end(), l[i]) - disc.begin() + 1;
r[i] = lower_bound(disc.begin(), disc.end(), r[i]) - disc.begin() + 1;
m = max(m, r[i]);
// debug(l[i], r[i]);
}
vector<int> pos[m+1];
vector<vector<int>> lift(m+2, vector<int> (LG, 0));
for (int i = 1; i <= n; i++) pos[l[i]].push_back(r[i]);
int mini = m+1;
lift[m+1][0] = m+1;
for (int i = m; i >= 0; i--) {
for (auto& rb : pos[i]) mini = min(mini, rb);
lift[i][0] = mini;
}
for (int i = 1; i < LG; i++) {
for (int j = 0; j <= m+1; j++) lift[j][i] = lift[lift[j][i-1]][i-1];
}
// cout << lift[0][0] << ' ' << lift[0][1] << '\n';
auto count = [&] (int lb, int rb) {
if (lb > rb) return 0LL;
int res = 0, sp = lb;
for (int i = LG - 1; i >= 0; i--) {
if (lift[sp][i] <= rb) {
// debug(sp, i, lift[sp][i], lb, rb, res);
sp = lift[sp][i], res += (1 << i);
}
}
return res;
};
int sum = count(1, m);
st.insert({1, m, sum});
// debug(sum);
if (sum < k) {
cout << "-1\n";
return;
}
vector<int> ans;
for (int i = 1; i <= n; i++) {
auto it = st.lower_bound({l[i]+1, 0, 0});
if (it == st.begin()) continue;
--it;
auto [ll, rr, val] = *it;
// debug(ll, rr, val);
if (ll <= l[i] && r[i] <= rr) {
int lp = count(ll, l[i]);
int rp = count(r[i], rr);
// cout << i << " " << lp << " " << rp << " " << val << '\n';
if (sum - val + lp + rp + 1 >= k) {
st.erase({ll, rr, val});
if (ll <= l[i]) st.insert({ll, l[i], lp});
if (r[i] <= rr) st.insert({r[i], rr, rp});
sum = sum - val + lp + rp + 1;
ans.push_back(i);
if (ans.size() >= k) break;
}
}
}
for (int e : ans) cout << e << '\n';
}
int32_t main() {
ios::sync_with_stdio(0); cin.tie(0);
int test = 1;
// cin >> test;
while (test--) solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |