#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned __int128 Hash; map> > g[11]; int N,K; vector res; map picked_counter; // [univ] = # priority_queue< array > Q; int get_best_univ(map > > &score){ while(Q.size()){ auto q = Q.top(); int id = q[2]; bool bad = false; if( score[id].size() == 0 ){ Q.pop(); continue; } if( score[id].top().first != q[1] ) bad = true; if( picked_counter[id] != q[0] ) bad = true; if( bad ){ Q.pop(); Q.push({picked_counter[id],score[id].top().first,id}); }else{ return id; } } return -1; } void pick(int id,map > > &score){ assert(score[id].size()>0); int me = score[id].top().second; picked_counter[id]--; score[id].pop(); Q.push({picked_counter[id],score[id].top().first,id}); res.push_back(me); K--; } void solve(map > > &score){ Q = priority_queue< array >(); for( auto i : score ){ Q.push({picked_counter[i.first],i.second.top().first,i.first}); } while(K>0){ int uid = get_best_univ(score); if( uid == -1 ) break; pick(uid,score); } } int main(){ cin >> N >> K; set univ; for(int i = 0 ; i < N ; i++){ int S,P,U; cin >> S >> P >> U; g[S][U].push({-P,i}); univ.insert(U); } for(int i = 10 ; i >= 0 ; i--){ solve(g[i]); } for(int i = 0 ; i < res.size() ; i++) cout << res[i] << endl; }