#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")