#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
// 交换
void swap(vector<int> &arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
// 构造大顶堆主要方法思想
void heaptify(vector<int> &arr,int i,int len){
int left=2*i+1,right=2*i+2,largest=i;
// 判断左右节点是否比当前根节点大
if(left<len&&arr[left]>arr[i]){
largest=left;
}
if(right<len&&arr[right]>arr[i]){
largest=right;
}
// 大就交换
if(largest!=i){
swap(arr,largest,i);
}
}
// 构造大顶堆主入口 从最后一个根 进行构造
void buildMaxHeap(vector<int> &arr){
for(int i=arr.size()/2-1;i>=0;i--){
heaptify(arr,i,arr.size());
}
}
int main() {
vector<int> arr;
// 输入操作次数
int n;
cin>>n;
//getline 会多出一个空行 判断条件取等号
for(int i=0;i<=n;i++){
// 按行取操作
string str;
getline(cin,str);
// push操作 入堆 构造大顶堆
if(str.length()>3){
int yt=atoi(str.substr(4).c_str());
arr.push_back(yt);
buildMaxHeap(arr);
}//top 操作 探空 输出
else if(str.compare("top")==0){
if(!arr.empty()){
cout<<arr[0]<<endl;
}else cout<<"empty"<<endl;
}// pop操作 探空输出 并且出堆
else if(str.compare("pop")==0){
if(!arr.empty()){
cout<<arr[0]<<endl;
arr.erase(arr.begin());
buildMaxHeap(arr);
}else cout<<"empty"<<endl;
}else continue;
}
return 0;
}
// 64 位输出请用 printf("%lld")