import java.util.*;
public class Main {
    public static int size = 0;
    public static HeapNode root;
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int optNum = input.nextInt();
        String line = input.nextLine();
        for (int i = 0; i < optNum; i++) {
            line = input.nextLine();
            if ("top".equals(line)) {
                top();
            } else if ("pop".equals(line)) {
                pop();
            } else {
                push(Integer.parseInt(line.substring(5)));
            }
        }
    }
    public static void top() {
        if (size == 0) {
            System.out.println("empty");
        } else {
            System.out.println(root.val);
        }
    }
    public static void pop() {
        if (size == 0) {
            System.out.println("empty");
        } else {
            System.out.println(root.val);
            //删除root结点,将root左右结点中更大的那个变成根节点
            //1.没有左节点
            if (root.right != null && root.left == null) {
                root = root.right;
            }
            //2.没有右节点
            else if (root.left != null && root.right == null) {
                root = root.left;
            }
            //3.都没有
            else if (root.left == null && root.right == null) {
                root = null;
            }
            //4.都有
            else {
                if (root.left.val > root.right.val) {
                    push(root.right, root.left);
                    root = root.left;
                } else {
                    push(root.left, root.right);
                    root = root.right;
                }
            }
            size--;
        }
    }
    public static void push(int x) {
        if (size == 0) {
            root = new HeapNode(x);
            size++;
            return;
        }
        HeapNode target = new HeapNode(x);
        push(target, root);
        size++;
    }
public static void push(HeapNode target, HeapNode top){
        if(target==null) return;
        //首先看看要去哪边,存在三种情况
        //1.x比top大,它就会成为新的top
        //2.x比top.left和top.right都大,但比top小,那么它会成为新的left或right
        //3.x比top.left或top.right其中之一小,那么它就去大的那边
        //4.x比top.left和top.right都小,就去深度小的子树那边
        int lVal = (top.left==null? Integer.MIN_VALUE:top.left.val);
        int rVal = (top.right==null? Integer.MIN_VALUE:top.right.val);
        //1.如果x比top大
        if(target.val>top.val){
            target.left = top;
            root = target;
        }else if(target.val<=lVal && target.val>rVal){
            if(rVal==Integer.MIN_VALUE){
                //如果右子树是空的
                top.right = target;
            }else{
                //不空的话往左子树加
                push(target,top.left);
            }
        }else if(target.val<=rVal && target.val>lVal){
            if(lVal==Integer.MIN_VALUE){
                //如果左子树是空的
                top.left = target;
            }else{
                //不空的话往右子树加
                push(target,top.right);
            }
        }else if(target.val>rVal){

            if(lVal==Integer.MIN_VALUE){
                top.left = target;
            }else if(rVal==Integer.MIN_VALUE){
                top.right = target;
            }else{
                if(lVal>rVal){
                    push(top.right,target);
                    top.right = target;
                }else {
                    push(top.left,target);
                    top.left = target;
                }
                
            }
        }else {
            if(lVal>rVal){
                push(target,top.right);
            }else{
                push(target,top.left);
            }
        }
    }
}

class HeapNode {
    int val;
    HeapNode left;
    HeapNode right;
    public HeapNode(int val) {
        this.val = val;
    }
}