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 Ruby (judge verdict: Accepted)

INFTY = (1<<30)
$h = 0
$a = []

def maxHeapify(i)
	l = 2 * i
	r = 2 * i + 1
	
	if l <= $h && $a[l] > $a[i]
		largest = l
	else
		largest = i
	end
	largest = r if r <= $h && $a[r] > $a[largest]

	if largest != i
		$a[i], $a[largest] = $a[largest], $a[i]
		maxHeapify(largest)
	end
end

def extract()
	return -INFTY if $h < 1
	maxv = $a[1]
	$a[1] = $a[$h]
	$h -= 1
	maxHeapify(1)
	return maxv
end

def increaseKey(i, key)
	return if key < $a[i]
	$a[i] = key
	while i > 1 && $a[i / 2] < $a[i]
		$a[i], $a[i / 2] = $a[i / 2], $a[i]
		i = i / 2
	end
end

def insert(key)
	$h += 1
	$a[$h] = -INFTY
	increaseKey($h, key)
end

loop do
	line = gets.split
	break if line[0] == "end"
	if line[0] == "insert"
		insert(line[1].to_i)
	else
		puts extract()
	end
end