#include <stdio.h>
#include <stdlib.h>
#define INF 100000000

void maxHeapify(int *,int,int);
void insert(int *,int,int);
void increasekey(int *,int,int);
int left(int i){return 2*i;}
int right(int i){return 2*i+1;}

int main()
{
  int A[2000001],key,H=0;
  char command[10];

  while(1){
    scanf("%s",command);
    //printf("%c",command[0]);
    if(command[0]=='i'){
      scanf("%d",&key);
      //printf("aaaaa");
      if(key>2000000000) exit(1);
      insert(A,H,key);
      H++;
    }
    else if(command[0]=='e' && command[1]=='x'){
      printf("%d\n",A[1]);
      A[1] = A[H]; //最後の数を根に持って来る
      H--; //最後の数を持って来たからサイズを減らす
      maxHeapify(A,H,1);
    }
    else break;
  }

  return 0;
}

void maxHeapify(int *A,int H,int i)
{
  int l,r,largest,t;
  
  l = left(i);
  r = right(i);
  //printf("/l=%d,r=%d\n",l,r);

  if(l<=H && A[l]>A[i]) largest = l; //親と左の子の比較
  else largest = i;
  if(r<=H && A[r]>A[largest]) largest = r; //親と右の子の比較
  if(largest != i){ //子が大きければ交換
    t = A[i];
    A[i] = A[largest];
    A[largest] = t;
    maxHeapify(A,H,largest); 
  }
}

void insert(int *A,int H,int key)
{
  H++; //サイズを上げる
  //A[H] = -INF; // 大きい負の数を入れることで後の判定をできるようにする
  increasekey(A,H,key);
}

void increasekey(int *A,int H,int key)
{
  int t;
  
  //if(key < A[H]) return; 
  A[H] = key;
  while(1){
    if(H<=1 || A[H/2] >=A[H]) break; // サイズがなくなるか、子が自分よりも大きいときは交換しない
    t = A[H];
    A[H] = A[H/2];
    A[H/2] = t;
    H = H/2; //自分の親に移動
  }
  
}

