#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<int> tr, L, R;
int nxt = 1;
int next(){
    nxt++;
    return nxt;
}
int update(int v, int l, int r, int pos, int val){
    int nv = next();
    L[nv] = L[v], R[nv] = R[v];
    if (l == r){
        tr[nv] = val;
        return nv;
    }
    int mid = (l + r) / 2;
    if (pos <= mid){
        L[nv] = update(L[nv], l, mid, pos, val);
    }
    else{
        R[nv] = update(R[nv], mid + 1, r, pos, val);
    }
    tr[nv] = tr[L[nv]] + tr[R[nv]];
    return nv;
}
int query(int v, int l, int r, int ql, int qr){
    if (l > qr || r < ql || v == 0){
        return 0;
    }
    if (ql <= l && r <= qr){
        return tr[v];
    }
    int mid = (l + r) / 2;
    return query(L[v], l, mid, ql, qr) + query(R[v], mid + 1, r, ql, qr);
}
vector<ll> f, lz;
int m;
void relax(int v, int l, int r){
    f[v] += lz[v] * (r - l + 1);
    if (l != r){
        lz[v * 2] += lz[v], lz[v * 2 + 1] += lz[v];
    }
    lz[v] = 0;
}
void upd(int v, int l, int r, int ql, int qr){
    relax(v, l, r);
    if (l > qr || r < ql){
        return;
    }
    if (ql <= l && r <= qr){
        lz[v]++;
        relax(v, l, r);
        return;
    }
    int mid = (l + r) / 2;
    upd(v * 2, l, mid, ql, qr);
    upd(v * 2 + 1, mid + 1, r, ql, qr);
    f[v] = f[v * 2] + f[v * 2 + 1];
}
int qu(int v, int l, int r, int ql, int qr){
    relax(v, l, r);
    if (l > qr || r < ql || ql > qr){
        return 0;
    }
    if (ql <= l && r <= qr){
        return f[v];
    }
    int mid = (l + r) / 2;
    return qu(v * 2, l, mid, ql, qr) + qu(v * 2 + 1, mid + 1, r, ql, qr);
}
int main(){
    int n, k, l, r;
    cin>>n>>k;
    set<int> se, se2;
    map<int, int> ma;
    vector<int> le(n + 1, 0), ri(n + 1, 0);
    tr.assign(5000000, 0), L.assign(5000000, 0), R.assign(5000000, 0);
    for (int i = 1; i <= n; i++){
        cin>>le[i]>>ri[i];
        se.insert(le[i]);
        se.insert(ri[i]);
    }
    int no = 1;
    for (auto el : se){
        ma[el] = no;
        no++;
    }
    no += 3;
    m = no;
    f.assign(4 * m + 4, 0);
    lz.assign(4 * m + 4, 0);
    vector<int> ev(m + 1, 0), ha(m + 1, 0);
    for (int i = 1; i <= n; i++){
        le[i] = ma[le[i]];
        ri[i] = ma[ri[i]];
        ev[ri[i]] = max(ev[ri[i]], le[i]);
        ha[ri[i]] = 1;
    }
    vector<int> ro(m + 1, 1);
    for (int i = 2; i <= m; i++){
        int q = query(ro[i - 1], 0, m, ev[i], i);
        if (ha[i] == 0 || q > 0){
            ro[i] = ro[i - 1];
        }
        else{
            ro[i] = update(ro[ev[i]], 0, m, ev[i], 1);
        }
    }
    se.clear();
    se.insert(m);
    se.insert(1);
    se2.insert(-1);
    se2.insert(-m);
    vector<int> ans, lv(m + 1, 0);
    ll su = query(ro[m], 0, m, 1, m);
    for (int i = 1; i <= n; i++){
        if (k == 0 || su < k){
            break;
        }
        l = le[i], r = ri[i];
        if (qu(1, 1, m, l + 1, r - 1) > 0) continue;
        int lb = -*se2.lower_bound(-l);
        int rb = *se.lower_bound(r);
        if (lv[lb] == 1) continue;
        ll ch = query(ro[l], 0, m, lb, l) + query(ro[rb], 0, m, r, rb) - query(ro[rb], 0, m, lb, rb);
        su += ch;
        if (su + 1 >= k){
            k--;
            ans.push_back(i);
            se.insert(l);
            se.insert(r);
            se2.insert(-l);
            se2.insert(-r);
            lv[l] = 1;
            upd(1, 1, m, l, r);
        }
        else{
            su -= ch;
        }
    }
    if (k != 0){
        cout<<-1<<"\n";
        return 0;
    }
    for (auto el : ans){
        cout<<el<<"\n";
    }
}
| # | 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... |