Submission #1294949

#TimeUsernameProblemLanguageResultExecution timeMemory
1294949Ice_manEvent Hopping 2 (JOI21_event2)C++20
100 / 100
106 ms24204 KiB
/**
 ____    ____    ____    __________________    ____    ____    ____
||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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...