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: Time Limit Exceeded)

class PriorityQueue
  def initialize
    @array = []
    @size = 0
  end
  
  def push(a)
    @array[@size] = a
    heapify_up(@size)
    @size += 1
  end
  
  def pop()
    raise unless @size > 0
    ans = @array[0]
    @size -= 1
    @array[0] = @array[@size]
    heapify_down(0)
    ans
  end

  def swap(p,q)
    @array[p], @array[q] = @array[q], @array[p]
  end

  def equal_or_better(p,q)
    (@array[p] <=> @array[q]) <= 0
  end

  def heapify_up(n)
    while n > 0
      parent = (n - 1) / 2
      break if equal_or_better(parent, n)
      swap(parent,n)
      n = parent
    end
  end

  def heapify_down(n)
    while true
      l, r = n * 2 + 1, n * 2 + 2
      break if @size <= l
      child = l
      child = r if r < @size && equal_or_better(r, l)
      break if equal_or_better(n, child)
      swap(child, n)
      n = child
    end
  end
end

Q = PriorityQueue.new
count = 0
while true do
  s, n = gets.split
  break if s == "end"

  if s == "insert"
    Q.push([-n.to_i, count])
    count += 1
  else
    p -(Q.pop()[0])
  end
end