This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int N;
vector<pair<pair<long long int,long long int>,int>> v;
long long int W;
long long int h1,h2;
priority_queue<pair<long long int,int>,vector<pair<long long int,int>>,greater<pair<long long int,int>>> satprime;
priority_queue<pair<long long int,int>> sat;
vector<pair<pair<long long int, long long int>,int>> nov;
bool c(pair<pair<long long int, long long int>,int> ii1, pair<pair<long long int, long long int>,int> ii2){
    return ii1.first.first * ii2.first.second < ii2.first.first * ii1.first.second;
}
int main(){
    scanf(" %d",&N);
    scanf(" %lld",&W);
    for(int i = 0; i < N; i++){
        scanf(" %lld",&h1);
        scanf(" %lld",&h2);
        v.push_back({{h1,h2},i});
    }
    sort(v.begin(),v.end(),c);
    long long int sum = 0;
    int ans = 0;
    for(int i = 0; i < N; i++){
        if( (sum + v[i].first.second) * v[i].first.first <= W * v[i].first.second){
            while(!satprime.empty() && (satprime.top().first + sum + v[i].first.second) * v[i].first.first <= W * v[i].first.second ){
                sum += satprime.top().first;
                sat.push(satprime.top());
                satprime.pop();
            }
            if(ans == sat.size() + 1){
                nov.push_back({{ (sum + v[i].first.second) * v[i].first.first,v[i].first.second }, i});
            }
            else{
                nov.clear();
                nov.push_back({{ (sum + v[i].first.second) * v[i].first.first,v[i].first.second },i});
            }
            ans = sat.size() + 1;
            //printf("%d %d\n",i,sum+v[i].first.second);
        }
        if(!sat.empty() && v[i].first.second < sat.top().first){
            pair<long long int,int> h = sat.top();
            satprime.push(h);
            sat.pop();
            sat.push({v[i].first.second,v[i].second});
            sum -= h.first;
            sum += v[i].first.second;
        }
        else{
            satprime.push({v[i].first.second,v[i].second});
        }
    }
    printf("%d\n",ans);
    sort(nov.begin(),nov.end(),c);
    int j = nov[0].second;
    while(!sat.empty()){
        sat.pop();
    }
    while(!satprime.empty()){
        satprime.pop();
    }
    sum = 0;
    for(int i = 0; i < N; i++){
        if( (sum + v[i].first.second) * v[i].first.first <= W * v[i].first.second){
            while(!satprime.empty() && (satprime.top().first + sum + v[i].first.second) * v[i].first.first <= W * v[i].first.second ){
                sum += satprime.top().first;
                sat.push(satprime.top());
                satprime.pop();
            }
        }
        if(i == j){
            sat.push({v[i].first.second,v[i].second});
            break;
        }
        if(!sat.empty() && v[i].first.second < sat.top().first){
            pair<long long int,int> h = sat.top();
            satprime.push(h);
            sat.push({v[i].first.second,v[i].second});
            sat.pop();
            sum -= h.first;
            sum += v[i].first.second;
        }
        else{
            satprime.push({v[i].first.second,v[i].second});
        }
    }
    while(!sat.empty()){
        printf("%d\n",sat.top().second + 1);
        sat.pop();
    }
}
Compilation message (stderr)
hiring.cpp: In function 'int main()':
hiring.cpp:40:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::priority_queue<std::pair<long long int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |             if(ans == sat.size() + 1){
      |                ~~~~^~~~~~~~~~~~~~~~~
hiring.cpp:18:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |     scanf(" %d",&N);
      |     ~~~~~^~~~~~~~~~
hiring.cpp:19:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |     scanf(" %lld",&W);
      |     ~~~~~^~~~~~~~~~~~
hiring.cpp:22:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   22 |         scanf(" %lld",&h1);
      |         ~~~~~^~~~~~~~~~~~~
hiring.cpp:23:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |         scanf(" %lld",&h2);
      |         ~~~~~^~~~~~~~~~~~~| # | 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... | 
| # | 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... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |