우선순위 큐
최대힙, 최소힙 두 가지의 큐를 가지고 계산한다. 최대힙 혹은 최소힙에서 임의의 노드가 pop()
된 경우, 최대힙과 최소힙끼리 방문처리를 진행한다.
방문처리의 경우, 현재 가장 앞에 있는 값의 인덱스를 체크했을 때, 최소힙 혹은 최대힙의 가장 앞의 값이라면, 그냥 바로 반환하도록 하였다.
모든 작업이 끝마친 경우, 큐가 비어있다면 EMPTY 를 출력, 그렇지 않은 경우는 최대힙, 최소힙 순으로 가장 앞의 값을 반환한자.
#include <iostream>
#include <queue>
#include <vector>
#define f first
#define s second
using namespace std;
int T, N;
priority_queue<pair<int, int>> maxQ;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> minQ;
const int MAX = 1e6 + 4;
void updateHeap(int check[MAX]) {
while (!maxQ.empty() && !check[maxQ.top().s]) maxQ.pop();
while (!minQ.empty() && !check[minQ.top().s]) minQ.pop();
}
void go() {
cin >> N;
maxQ = priority_queue<pair<int, int>>();
minQ = priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>();
int check[MAX];
char op;
int num;
for (int i = 0; i < N; i++) {
cin >> op >> num;
if (op == 'I') {
maxQ.push({num, i});
minQ.push({num, i});
check[i]++;
} else {
if (num == 1 && !maxQ.empty()) {
check[maxQ.top().s]--;
maxQ.pop();
} else if (num == -1 && !minQ.empty()) {
check[minQ.top().s]--;
minQ.pop();
}
updateHeap(check);
}
}
}
void output() {
if (maxQ.empty()) cout << "EMPTY" << "\n";
else cout << maxQ.top().f << " " << minQ.top().f << "\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
while (T--) {
go();
output();
}
}