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


#define	SIZE	2000000


// up_heap 必要な所まで浮かび上がらせる
void Insert(int *tree, int key, int pos)
{
	int parent = pos / 2;


	while(pos > 1){
		if(tree[parent] < key){
			tree[pos] = tree[parent];
			pos = parent;
			parent = pos / 2;
		}else
			break;
	}
	tree[pos] = key;
}


// down_heap	一番上を一番下(pos)と交換、一番上の値をちょうど良いところまで沈ませる
void Delete(int *tree, int count)
{
	int x;
	int pos;
	int left = 2;


	printf("%d\n", tree[1]);

	x = tree[1] = tree[count--];
	pos = 1;
	while(left <= count){
		if(left + 1 <= count && tree[left] < tree[left + 1])
			left++;

		if(x < tree[left]){
			tree[pos] = tree[left];
			pos = left;
			left = pos * 2;
		}else
			break;
	}
	tree[pos] = x;
}


int main()
{
	int *tree;
	char command[10];
	int key;
	int count;
	int i;

	tree = (int *)malloc(sizeof(int) * SIZE);

	count = 1;
	while(1){
		scanf("%s", command);

		if(!strcmp(command, "insert")){
			scanf("%d", &key);
			Insert(tree, key, count);
			count++;
		}else if(!strcmp(command, "extract")){
			Delete(tree, --count);
		}else if(!strcmp(command, "end")){
			break;
		}
	}

	return 0;
}
