import sys
import heapq
from collections import defaultdict
op_x = list(map(int,sys.stdin.read().split()))
ptr =0
#总共操作数量
n =op_x[ptr]
#操作指针
ptr+=1
#用于存储x(最小堆)
minheap=[]
#用于存储-x(最大堆)
maxheap = []
#用于联系最大小堆,记录每个元素的当前存在数量(默认0)
count = defaultdict(int)
while ptr<len(op_x):
op = op_x[ptr]
ptr+=1
if op==1:
x=op_x[ptr]
heapq.heappush(minheap,x)
heapq.heappush(maxheap,-x)
count[x]+=1#有在原来基础上+1
ptr+=1
#查最小值
elif op==2:
#证明该最小堆顶,在maxheap中已经删除,所以要在最小堆中也删除
while minheap and count[minheap[0]]==0:
heapq.heappop(minheap)
if len(minheap)>0 :
print(minheap[0])
#查最大值
elif op==3:
#同上而且maxheap中存-x所以要加上-
while maxheap and count[-maxheap[0]]==0:
heapq.heappop(maxheap)
if len(maxheap)>0:
print(-maxheap[0])
# 删除最小值(只删除一个)
elif op ==4:
while minheap and count[minheap[0]]==0:
heapq.heappop(minheap)
if len(minheap)>0:
#将计数-1
count[minheap[0]]-=1
heapq.heappop(minheap)
#删除最大值
else:
while maxheap and count[-maxheap[0]]==0:
heapq.heappop(maxheap)
if len(maxheap)>0:
count[-maxheap[0]]-=1
heapq.heappop(maxheap)