Submission #519940

#TimeUsernameProblemLanguageResultExecution timeMemory
519940CaroLindaEvent Hopping 2 (JOI21_event2)C++14
100 / 100
182 ms24796 KiB
#include <bits/stdc++.h>
 
#define mkt make_tuple
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x.size())
#define ll long long
#define lp(i,a,b) for(int i = a ; i < b ; i++ )
#define pii pair<int,int>
#define mk make_pair
#define ff first
#define ss second
#define tiii tuple<int,int,int>
#define pb push_back

const int MAX = 2e5+10 ;
const int LOG  = 20 ;

using namespace std ;

int N , K ;
int L[MAX], R[MAX] ;
int dp[LOG][MAX] ;

int qry(int ini, int fim ) {
	int ans = 0 ;
	for(int i=LOG-1 ; i>= 0 ; i-- ){
		if( dp[i][ini] <= fim ){
			ans += (1<<i) ;
			ini = dp[i][ini] ;
		}
	}
	return ans ;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0) ;

	cin >> N  >> K ;

	vector<int> p ;

	for(int i = 1 ; i <= N ; i++ ) {
		cin >> L[i] >> R[i] ;
		p.pb(L[i] ) ;
		p.pb(R[i] ) ;
	}

	sort(all(p) ) ;
	p.erase(unique(all(p) )  , p.end() ) ;

	for(int i = 0 ; i < LOG ; i++ )
		for(int j = 0 ; j < sz(p) ; j++ ) dp[i][j] = 2*N + 10 ;

	for(int i = 1 ; i <= N ; i++ ){
		L[i] = lower_bound(all(p) , L[i] ) - p.begin() ;
		R[i] = lower_bound(all(p) , R[i] ) - p.begin() ;
		dp[0][L[i]]=min(dp[0][L[i]], R[i] ) ;
	}

	for(int i = sz(p)-2 ; i >= 0 ; i-- ) dp[0][i] = min( dp[0][i+1], dp[0][i] ) ;

	for(int i = 1 ; i < LOG ; i++ )
		for(int j = 0;  dp[i-1][j] < sz(p) ; j++ )
			dp[i][j]=dp[i-1][dp[i-1][j]];


	vector<int> ans ;
	set<pair<int,int> > s ;
	s.insert(mk(0,sz(p)-1) ) ;

	int qtd = qry(0,sz(p)-1) ;

	if(qtd < K ) {
		cout << "-1\n" ;
		return 0 ;
	}

	for(int i = 1 ; i <= N && sz(ans) < K ; i++ ) {
		auto it = s.upper_bound(mk(L[i] +1, -1 )) ;
		if(it == s.begin() ) continue ;
		it-- ;
		int l = it->first, r = it->second ;
		if(r < R[i] ) continue ;

		int newQtd = qtd-qry(l,r)+1 ;

		if( l <= L[i] ) newQtd += qry(l,L[i] ) ;
		if( R[i] <= r ) newQtd += qry(R[i], r ) ;

		if(newQtd < K ) continue ;

		qtd = newQtd ;

		s.erase(it) ;
		s.insert( mk(l,L[i] ) ) ;
		s.insert(mk(R[i], r) ) ;

		ans.pb(i) ;
	}

	for(auto e : ans ) cout << e <<"\n" ;
}
	      
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...