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 Scala (judge verdict: Runtime Error)

import scala.io.StdIn.{readLine,readInt}
import scala.collection.mutable.ArrayBuffer

object Main {
  var size = 0

  def swap(a:Array[Long],i:Int,j:Int) =  {
    val temp = a(i)
    a(i) = a(j)
    a(j) = temp
  }

  def maxHeapify(a:Array[Long], i:Int):Unit = {
    var largest = i
    if(i*2 <= size) {
      if(a(i*2-1) > a(i-1)) largest = i*2
      if(i*2+1<=size && a(i*2) > a(largest-1)) largest = i*2+1
      if(largest != i) {
        swap(a,i-1,largest-1)
        maxHeapify(a,largest)
      }
    }
  }

  def extract(a:Array[Long]):String = {
    val max = a(0)
    if(size>0) {
      a(0) = a(size-1)
      size -= 1
      for(i<-size/2 to 1 by -1) {
        maxHeapify(a,i)
      }
    }
    max.toString
  }

  def insert(a:Array[Long], n:Long) = {
    a(size) = n
    size += 1
    def upHeap(i:Int):Unit =
      if(i/2>0) {
        if(a(i/2-1) < a(i-1)) {
          swap(a,i/2-1,i-1)
          upHeap(i/2)
        }
      }
    upHeap(size)
  }

  def main(args:Array[String]) = {
    val a = new Array[Long](3100000)
    val b = new ArrayBuffer[String]
    Iterator.continually(readLine).takeWhile(s=>s!=null && s.trim!="end").foreach { s=>
      val op = s.split(" ")
      if(op(0) == "insert") {
        insert(a, op(1).toLong)
      } else if(op(0) == "extract") {
        b+=extract(a)
      }
    }
     println(b.mkString("\n"))
  }
}