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)