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 <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 2000000
#define INFTY 1 << 30
#define parent(x) x / 2
#define left(x) x * 2
#define right(x) x * 2 + 1

int H, A[MAX + 1];

void maxHeapify(int i)
{
	int l = left(i);
	int r = right(i);

	if (l > H) return;
	else if (r > H)
	{
		if (A[i] < A[l])
		{
			int temp = A[i];
			A[i] = A[l];
			A[l] = temp;
		}
		else return;
	}
	else
	{
		if (A[i] >= A[l] && A[i] >= A[r]) return;
		int large = A[l] > A[r] ? l : r;
		int temp = A[i];
		A[i] = A[large];
		A[large] = temp;
		maxHeapify(large);
	}
}

int extract()
{
	int maxv;
	if (H < 1)
		return -INFTY;
	maxv = A[1];
	A[1] = A[H--];
	maxHeapify(1);
	return maxv;
}

void increaseKey(int i, int key)
{
	if (key < A[i])
		return;
	A[i] = key;
	while (i > 1 && A[i / 2] < A[i])
	{
		swap(A[i], A[i / 2]);
		i = i / 2;
	}
}

void insert(int key)
{
	A[++H] = -INFTY;
	increaseKey(H, key);
}

int main()
{
	int key;
	char com[10];
	while (1)
	{
		scanf("%s", com);
		if (com[0] == 'e' && com[1] == 'n')
			break;
		if (com[0] == 'i')
		{
			scanf("%d", &key);
			insert(key);
		}
		else
		{
			printf("%d\n", extract());
		}
	}
	return 0;
}