Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- #include <queue>
- using namespace std;
- struct Worker {
- long long time;
- int level;
- long long answer;
- };
- int main()
- {
- int n_people, n_levels;
- scanf("%d %d", &n_people, &n_levels);
- vector<Worker> workers(n_people);
- for(int i = 0; i < n_people; i++)
- {
- scanf("%d %d", &workers[i].time, &workers[i].level);
- workers[i].answer = -1;
- }
- auto greater_level = [](const Worker * const left, const Worker * const right) {
- return left->level > right->level;
- };
- priority_queue<Worker*, vector<Worker*>, decltype(greater_level)> waiting(greater_level);
- int index = 0; //unhandled
- long long current_time = 0;
- for(int i = 0; i < n_people; i++)
- {
- if(workers[i].answer != -1)
- {
- continue;
- }
- long long start_time = max(current_time, workers[i].time);
- int top_level = workers[i].level;
- long long top_time = start_time + (top_level - 1);
- long long end_time = top_time + (top_level - 1);
- while (!waiting.empty() && waiting.top()->level <= top_level)
- {
- waiting.top()->answer = end_time;
- waiting.pop();
- }
- while(index < n_people && workers[index].time <= end_time)
- {
- Worker ¤t = workers[index];
- if(current.level <= top_level && current.level + current.time <= top_level + top_time)
- {
- current.answer = end_time;
- } else
- {
- waiting.push(¤t);
- }
- index++;
- }
- current_time = end_time;
- }
- for(int i = 0; i < n_people; i++)
- {
- printf("%lld\n", workers[i].answer);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement