import java.util.*;

class Solution {
    public int[] solution(String[] operations) {
        
        PriorityQueue<Number> max = new PriorityQueue<>((o1,o2)->o2.value-o1.value);
        PriorityQueue<Number> min = new PriorityQueue<>((o1,o2)->o1.value-o2.value);
        
        for(String operation : operations){
            String[] split = operation.split(" ");
            if(split[0].equals("I")){
                Number num = new Number(Integer.parseInt(split[1]));
                max.add(num);
                min.add(num);
            }else if(split[1].equals("1")){
                //최댓값 제거
                while(!max.isEmpty()){
                    Number num = max.poll();
                    if(num.isDeleted) continue;
                    num.isDeleted = true;
                    break;
                }
            }else{
                //최소값 제거
                while(!min.isEmpty()){
                    Number num = min.poll();
                    if(num.isDeleted) continue;
                    num.isDeleted = true;
                    break;
                }
            }
        }
        
        //전처리
        Deque<Number> tempQ = new ArrayDeque<>();
        //Queue<Number> tempQ = new ArrayDeque<>();

        int size = max.size();
        // for(int i=0 ; i<max.size() ; i++){
        //아오;;; 변하는수를 저기에 넣었네;;;
        for(int i=0 ; i<size ; i++){
            if(max.isEmpty()) break;
            if(max.peek().isDeleted) {
                max.poll();
            }
            else{
                tempQ.add(max.poll());
            }
        }
        // max 333 45 -45 -642(-)
        // min  -45 45 333 97(-) 653(-)
        
        if(tempQ.isEmpty()){
            return new int[]{0,0};
        }
        
        int[] answer = new int[2];
        //System.out.println(tempQ.size());

        answer[0] = tempQ.peekFirst().value;
        answer[1] = tempQ.peekLast().value;
        return answer;
    }
    
    class Number{
        public int value;
        public boolean isDeleted = false;
        Number(int value){
            this.value = value;
        }
    }
}
import java.util.PriorityQueue;

public class Solution {
    private static class DoublyPriorityQueue {
        private int size = 0;
        private final PriorityQueue<Integer> minPq
                = new PriorityQueue<>();
        private final PriorityQueue<Integer> maxPq
                = new PriorityQueue<>((a, b) -> b - a);

        public void add(int value) {
            minPq.add(value);
            maxPq.add(value);
            size++;
        }

        public void removeMax() {
            if (size == 0) return;
            maxPq.poll();
            if (--size == 0) {
                maxPq.clear();
                minPq.clear();
            }
        }

        public void removeMin() {
            if (size == 0) return;
            minPq.poll();
            if (--size == 0) {
                maxPq.clear();
                minPq.clear();
            }
        }

        public int max() {
            if (size == 0) return 0;
            return maxPq.peek();
        }

        public int min() {
            if (size == 0) return 0;
            return minPq.peek();
        }
    }

    public int[] solution(String[] operations) {
        DoublyPriorityQueue dpq = new DoublyPriorityQueue();
        for (String operation : operations) {
            String[] tokens = operation.split(" ");
            String command = tokens[0];
            String value = tokens[1];
            switch (command) {
                case "I" -> dpq.add(Integer.parseInt(value));
                case "D" -> {
                    if (value.equals("1")) {
                        dpq.removeMax();
                    } else {
                        dpq.removeMin();
                    }
                }
            }
        }
        return new int[]{dpq.max(), dpq.min()};
    }
}