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
  attr_reader :values

  def initialize(&comparator)
    @values = [nil]
    @pos = 0
    @comparator = comparator || -> (a, b) { a <=> b }
  end

  def push(value)
    @pos += 1
    @values[@pos] = value

    i = @pos

    while i >= 2 && @comparator.call(@values[i], @values[i / 2]) < 0
      @values[i], @values[i / 2] = @values[i / 2], @values[i]
      i /= 2
    end
  end

  def pop
    return nil if @pos < 1

    ret = @values[1]
    @values[1] = @values[@pos]
    @pos -= 1

    i = 1

    loop do
      l = i * 2
      r = l + 1

      j = l <= @pos && @comparator.call(@values[i], @values[l]) > 0 ? l : i
      j = r <= @pos && @comparator.call(@values[j], @values[r]) > 0 ? r : j

      break if j == i

      @values[i], @values[j] = @values[j], @values[i]

      i = j
    end

    ret
  end
end

if $PROGRAM_NAME == __FILE__
  queue = PriorityQueue.new do |a, b|
    b <=> a
  end

  while line = gets
    line = line.chomp

    break if line == 'end'

    command, value = line.split
    value = value.to_i if value

    case command
    when 'insert'
      queue.push(value)
    when 'extract'
      puts queue.pop
    else
      raise "unknown command: #{command}"
    end
  end
end