import java.util.Scanner;
public class Main {
private static int[] heap = new int[100010]; // 堆数组
private static int size = 0; // 当前堆大小
// 获取父节点索引
private static int parent(int i) {
return i / 2;
}
// 获取左孩子索引
private static int left(int i) {
return 2 * i;
}
// 获取右孩子索引
private static int right(int i) {
return 2 * i + 1;
}
// 交换两个元素
private static void swap(int i, int j) {
int temp = heap[i];
heap[i] = heap[j];
heap[j] = temp;
}
// 上浮操作
private static void siftUp(int i) {
while (i > 1 && heap[i] > heap[parent(i)]) {
swap(i, parent(i));
i = parent(i);
}
}
// 下沉操作
private static void siftDown(int i) {
int maxIndex = i;
int l = left(i);
int r = right(i);
if (l <= size && heap[l] > heap[maxIndex]) {
maxIndex = l;
}
if (r <= size && heap[r] > heap[maxIndex]) {
maxIndex = r;
}
if (i != maxIndex) {
swap(i, maxIndex);
siftDown(maxIndex);
}
}
// 插入元素
private static void push(int x) {
if (size >= heap.length - 1) return; // 防止溢出
size++;
heap[size] = x;
siftUp(size);
}
// 获取堆顶
private static void top() {
if (size == 0) {
System.out.println("empty");
} else {
System.out.println(heap[1]);
}
}
// 弹出堆顶
private static void pop() {
if (size == 0) {
System.out.println("empty");
} else {
System.out.println(heap[1]);
heap[1] = heap[size];
size--;
siftDown(1);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine(); // 消耗换行符
for (int i = 0; i < n; i++) {
String line = sc.nextLine().trim();
if (line.startsWith("push")) {
int x = Integer.parseInt(line.split(" ")[1]);
push(x);
} else if (line.equals("top")) {
top();
} else if (line.equals("pop")) {
pop();
}
}
}
}