/**
____ ____ ____ __________________ ____ ____ ____
||I || ||c || ||e || || || ||M || ||a || ||n ||
||__|| ||__|| ||__|| ||________________|| ||__|| ||__|| ||__||
|/__\| |/__\| |/__\| |/________________\| |/__\| |/__\| |/__\|
*/
#include <bits/stdc++.h>
#define maxn (int)(4e5 + 5)
#define maxlog (int)(20)
#define PB push_back
#define X first
#define Y second
typedef long long ll;
typedef std::pair <int, int> pii;
typedef std::pair <ll, ll> pll;
typedef std::pair <int, ll> pil;
typedef std::pair <ll, int> pli;
const ll mod = 1e9 + 7;
const ll INF = 1e9;
int pre[maxn], n , k;
struct sparse_table
{
int table[maxlog][maxn];
void build()
{
for(int i = 1; i <= 2 * n + 1; i++)
table[0][i] = pre[i];
for(int power = 1; (1LL << power) <= 2 * n + 1; power++)
for(int i = 1; i <= 2 * n; i++)
if(table[power - 1][i] > 0 && table[power - 1][i] <= 2 * n + 1)
table[power][i] = table[power - 1][table[power - 1][i]];
else
table[power][i] = 0;
}
int get(int l, int r)
{
if(l == 0)
l = 1;
if(r == 2 * n + 1)
r = 2 * n;
if(l > r)
return 0;
int pp = l, ret = 0;
for(int power = maxlog - 1; power >= 0; power--)
if(table[power][pp] != 0 && table[power][pp] <= r)
{
ret += (1 << power);
pp = table[power][pp];
}
return ret;
}
};
sparse_table tt;
void read_solve()
{
std::cin >> n >> k;
std::vector <int> l(n + 1) , r(n + 1);
std::vector <std::pair <int , pii> > sorted;
for(int i = 1; i <= n; i++)
{
std::cin >> l[i] >> r[i];
sorted.PB({l[i] , {i , -1}});
sorted.PB({r[i] , {i , 1}});
}
std::sort(sorted.begin() , sorted.end());
int comp = 0;
for(int i = 0; i < sorted.size(); i++)
{
if(i == 0 || sorted[i].X > sorted[i - 1].X)
comp++;
if(sorted[i].Y.Y == -1)
l[sorted[i].Y.X] = comp;
else
r[sorted[i].Y.X] = comp;
}
for(int i = 0; i <= 2 * n + 1; i++)
pre[i] = 2 * n + 1;
for(int i = 1; i <= n; i++)
pre[l[i]] = std::min(pre[l[i]] , r[i]);
for(int i = 2 * n - 1; i >= 1; i--)
pre[i] = std::min(pre[i] , pre[i + 1]);
pre[0] = 1;
tt.build();
if(tt.get(1 , 2 * n) < k)
{
std::cout << -1 << "\n";
return;
}
std::set <pii> seg;
seg.insert({0 , 0});
seg.insert({2 * n + 1 , 2 * n + 1});
std::vector <int> ans;
int br = tt.get(1 , 2 * n);
for(int i = 1; i <= n; i++)
{
if(ans.size() == k)
break;
auto it = seg.lower_bound({l[i] , 0});
if(it -> X != it -> Y && it -> X < r[i])
continue;
auto pom = std::prev(it);
if(pom -> X != pom -> Y && pom -> Y > l[i])
continue;
int smetka = tt.get(pom -> Y , l[i]) + tt.get(r[i] , it -> X) - tt.get(pom -> Y , it -> X);
if(br + smetka + 1 >= k)
{
br += smetka + 1;
ans.PB(i);
seg.insert({l[i] , r[i]});
}
}
//std::cout << "!!! " << ans.size() << "\n";
for(auto& e : ans)
std::cout << e << "\n";
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int tests = 1;
//std::cin >> tests;
while(tests--)
{
read_solve();
}
return 0;
}
| # | 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... |