Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Priority Queue

A priority queue is a data structure which maintains a set $S$ of elements, each of with an associated value (key), and supports the following operations:

$insert(S, k)$: insert an element $k$ into the set $S$

$extractMax(S)$: remove and return the element of $S$ with the largest key

Write a program which performs the $insert(S, k)$ and $extractMax(S)$ operations to a priority queue $S$.
The priority queue manages a set of integers, which are also keys for the priority.

Input

Multiple operations to the priority queue $S$ are given. Each operation is given by "insert $k$", "extract" or "end" in a line. Here, $k$ represents an integer element to be inserted to the priority queue.

The input ends with "end" operation.

Output

For each "extract" operation, print the element extracted from the priority queue $S$ in a line.

Constraints

The number of operations $\leq 2,000,000$

$0 \leq k \leq 2,000,000,000$

Sample Input 1

insert 8
insert 2
extract
insert 10
extract
insert 11
extract
extract
end

Sample Output 1

8
10
11
2

Solution in C (judge verdict: Accepted)

#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;
}