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: Wrong Answer)

def left_p(i)
  2 * i
end
def right_p(i)
  2 * i + 1
end
def parent_p(i)
  i / 2
end

def max_heapfy(arr, i)
  l = left_p(i)
  r = right_p(i)

  if l <= arr.size && arr[l - 1] > arr[i - 1]
    largest = l
  else
    largest = i
  end

  if r <= arr.size && arr[r - 1] > arr[largest - 1]
    largest = r
  end

  if largest != i
    tmp = arr[largest - 1]
    arr[largest - 1] = arr[i - 1]
    arr[i - 1] = tmp
    max_heapfy(arr, largest)
  end
end

def build_max_heap(arr)
  i = arr.size / 2 + 1
  while i > 0
    max_heapfy(arr, i)
    i = i - 1
  end
end

def heap_increase_key(arr, key)
  now = arr.last
  arr.push(key)
  if now != nil && key > now
    i = arr.size
    while i > 1 && arr[parent_p(i) - 1] < arr[i - 1]
      tmp = arr[i - 1]
      arr[i - 1] = arr[parent_p(i) - 1]
      arr[parent_p(i) - 1] = tmp
      i = parent_p(i)
    end
  end
end

def insert(arr, key)
  heap_increase_key(arr, key)
end

def heap_extra_max(arr)
  if arr.size < 1
    nil
  else
    max = arr[0]
    arr[0] = arr.last
    arr = arr.take(arr.size - 1)
    max_heapfy(arr, 1)
    max
  end
end


arr = []
s = STDIN.gets
while s != nil && s != "end"
  ss = s.split(' ')
  if ss[0] == "insert"
    insert(arr, ss[1].to_i)
  elsif ss[0] == "extract"
    puts heap_extra_max(arr)
  end
  s = STDIN.gets
end