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
  @@INF = 1.0 / 0
  #?????????
  def initialize
    @queue = Array.new(1)
    @queue[0] = -114514
  end

  #???????????????????´??????????
  def top
    @queue[1]
  end

  #???????????????????´??????????????????????????´??????????
  def pop
    return if @queue.size < 1
    top = @queue[1]
    @queue[1] = @queue[@queue.size - 1]
    @queue.pop
    max_heap(1)
    top
  end

  #?????\
  def push(n)
    @queue.push(n)
    @queue[@queue.size - 1] = -1 * @@INF
    increase_key(@queue.size - 1,n)
  end

  #????????????????
  def empty?
    @queue.size == 1
  end

  #????´???°
  def size
    @queue.size - 1
  end

  #?????\?????????
  def increase_key(i,key)
    return if key < @queue[i]
    @queue[i] = key
    while i > 1 && @queue[i / 2] < @queue[i] do
      @queue[i],@queue[i / 2] = @queue[i / 2],@queue[i]
      i = i / 2
    end
  end

  #?????§???
  def max_heap(i)
    l = 2 * i
    r = 2 * i + 1
    if l< @queue.size && @queue[l] > @queue[i] then largest = l
    else largest = i end
    largest = r if r < @queue.size && @queue[r] > @queue[largest]
    if largest != i then
      @queue[i],@queue[largest] = @queue[largest],@queue[i]
      max_heap(largest)
    end
  end

  #?????§?????´??°
  def build_max_heap!
    return if @queue.size == 2
    (@queue.size / 2).downto(1) do |i|
      max_heap(i)
    end
  end
end

pq = PriorityQueue.new
loop do
  input = gets.split
  if input[0][0] == "i" then
    pq.push(input[1].to_i)
  elsif input[0] == "extract" then
    puts pq.pop
  else
    break
  end
end