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)

class PriorityQueue
  def initialize
    @n = 0
    @heap = []
  end
  
  def maxHeapify x
    l = 2*x
    r = 2*x+1
    if l <= @n && @heap[l] > @heap[x]
      largest = l
    else
      largest = x
    end
    if r <= @n && @heap[r] > @heap[largest]
      largest = r
    end
    if largest != x
      @heap[x], @heap[largest] = @heap[largest], @heap[x]
      maxHeapify(largest)
    end
  end
   
  def extract
    key = @heap[1]
    @heap[1] = @heap[@n]
    @n -= 1
    maxHeapify(1)
    key
  end
   
  def insert key
    @n += 1
    @heap[@n] = key
    i = @n
    while i > 1 && @heap[i/2] < @heap[i]
      @heap[i], @heap[i/2] = @heap[i/2], @heap[i]
      i /= 2
    end
  end
end

pq = PriorityQueue.new
while l = gets
  break if l.chomp == "end"
  if l.chomp == "extract" then puts pq.extract
  else pq.insert(l.split[1].to_i)
  end
end