#include<bits/stdc++.h>
#define ll long long
struct JohnsonRule
{
// Schedule jobs for 2 machines
struct Job {
int time_a, time_b;
int min_time;
int idx;
Job(int idx_, int time_a_, int time_b_) {
idx = idx_; time_a = time_a_; time_b = time_b_;
min_time = time_a < time_b ? time_a : time_b;
}
bool operator < (Job j) const {
return min_time < j.min_time;
}
};
vector<Job> jobs;
void addJob(int x_time, int y_time) {
int njob = jobs.size();
Job j(njob, x_time, y_time);
jobs.push_back(j);
}
pair< vector<int>, ll > scheduleJobs() {
vector<int> queue_a, queue_b;
sort(jobs.begin(), jobs.end());
for (int j = 0; j < jobs.size(); ++j) {
if (jobs[j].time_a < jobs[j].time_b)
queue_a.push_back(j);
else
queue_b.push_back(j);
}
vector<int> job_queue(queue_a);
job_queue.insert(job_queue.end(), queue_b.rbegin(), queue_b.rend());
ll elapsed_a = 0, elapsed_b = 0;
for (int j : job_queue) {
elapsed_a += jobs[j].time_a;
if (elapsed_a > elapsed_b)
elapsed_b = elapsed_a;
elapsed_b += jobs[j].time_b;
}
vector<int> schedule;
for (int j : job_queue)
schedule.push_back(jobs[j].idx);
return make_pair(schedule, elapsed_b);
}
};