#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

#define MAX 2000000   /* キューSの最大サイズ */

void insert(int S[], int key);
void increaseKey(int S[], int i, int key);
int extractMax(int S[]);
void swap(int *, int *);
void maxHeapify(int heap[], int i);


int length;      /* 優先度付きキューSのサイズ */

int main()
{
  int S[MAX], k;
  char com[16];

  while(1)
    {
      scanf("%s", com);

      if( com[0] == 'e' && com[1] == 'n' )
	break;
      if( com[0] == 'i' )
	{
	  scanf("%d", &k);
	  insert(S, k);
	}
      else
	printf("%d\n", extractMax(S) );
    }
  
  return 0;
}


/* S[i]を根ノードとする部分木を最大ヒープに変換する関数 */
void maxHeapify(int S[], int i)
{
  int l = i*2, r = i*2+1, largest;

  /* 根ノードheap[i]、左の子、右の子の中から最大のものを求める */
  if( l<=length && S[i] < S[l] )
    largest = l;
  else
    largest = i;
  if( r<=length && S[largest] < S[r] )
    largest = r;

  if( i != largest )
    {
      swap(&S[i], &S[largest]);
      maxHeapify(S, largest);
    }
}


/* int型変数 a,b を交換する関数 */
void swap(int *a, int *b)
{
  int tmp;

  tmp = *a;
  *a  = *b;
  *b  = tmp;
}

/*　優先度付きキューSにキー値がkeyのノードを挿入する関数　*/
void insert(int S[], int key)
{
  S[++length] = INT_MIN;         /* increaseKey関数の汎用性維持のためにinsert関数内でINT_MINを代入する必要がある*/
  increaseKey(S, length, key);
}

/*　S[i]のキー値をより大きな値のkeyに変更し、最大ヒープ構造を満たすように適切な位置に移動させる関数　*/
void increaseKey(int S[], int i, int key)
{
  int parent = i/2;

  if( S[i] > key )
    {
      fprintf(stderr, "Error! New key is smaller than current key.\n");
      exit(2);
    }
  S[i] = key;

  while( i > 1 && S[i] > S[parent] )
    {
      swap(&S[i], &S[parent]);
      i = parent;
      parent = i/2;
    }
}

/*　優先度付きキューSから最大のキー値を持つノードを求め削除し、その値を返す関数　*/
int extractMax(int S[])
{
  int max;

  if( length < 1 )
    {
      fprintf(stderr, "heap underflow\n");
      exit(3);
    }

  max  = S[1];
  S[1] = S[length--];
  maxHeapify(S, 1);

  return max;
}

