// // 活动地址: 牛客春招刷题训练营 - 编程打卡活动
// #include<iostream>
// #include<algorithm>
// #include<cmath>
// #include<vector>
// #include<stack>
// #define int long long 

// using namespace std;



// void solve(){
//      int  n;
//      cin>>n;
//      stack<int>s;
//      while(n--){
//         string t;
//         cin>>t;
//         if(t=="push"){ // 如果是push  
//             int x;
//             cin>>x;
//             s.push(x);
//         }
//         else if(t=="top"){
//             if(s.empty())cout<<"empty"<<"\n";
//             else cout<<s.top()<<"\n";
//         }
//         else {
//             if(s.empty())cout<<"empty"<<"\n";
//             else {
//                 cout<<s.top()<<"\n";
//                  s.pop();
               
               
//             }
//         }
//      }  
// }

// signed main(){
//     int T=1;
//     ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//     //cin>>T; // T 组数据
//     while(T--){
//         solve();
//     }
//     return 0;
// }
// 活动地址: 牛客春招刷题训练营 - 编程打卡活动

#include<bits/stdc++.h>
#include <vector>
using namespace std;
 /// 注意题目 说的是 实现一个 大根堆 所以 得用二叉树 来实现 
 /// 所以感觉这题还是有点超标的!
void down(int r, vector<int>& h, int size) {
    //h->heap;r->root;l->larger_one;
    int l = r;
    if (r * 2 <= size && h[r * 2] > h[l]) l = r * 2;
    if (r * 2 + 1 <= size && h[r * 2 + 1] > h[l]) l = r * 2 + 1;
    if (r != l) {
        swap(h[r], h[l]);
        down(l, h, size);
    }
    return;
}
void up(int c, vector<int>& h) {
    //h->heap;c->child;l->larger_one;
    int l = c;
    if (c % 2 == 0 && h[c / 2] < h[l]) l = c / 2;
    else if (c % 2 == 1 && h[(c - 1) / 2] < h[l]) l = (c - 1) / 2;
    if (c != l) {
        swap(h[c], h[l]);
        if (l > 1) up(l, h);
    }
    return;
}
int main() {
    int n = 0, size = 0, x = 0;
    string s;
    cin >> n;
    vector<int> heap(n + 1, 0);
    while (n--) {
        cin >> s;
        if (s == "push") {
            cin >> x;
            heap[++size] = x;
            if (size != 1) up(size, heap);
        } else if (s == "top") {
            if (heap[1]) {
                cout << heap[1] << endl;
            } else {
                cout << "empty" << endl;
            }
        } else {
            if (heap[1]) {
                cout << heap[1] << endl;
                swap(heap[1], heap[size]);
                heap[size--] = 0;
                down(1, heap, size);
            } else {
                cout << "empty" << endl;
            }
        }
    }
}