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 OCaml (judge verdict: Accepted)

let swap a i j =
    let temp = a.(i) in
    a.(i) <- a.(j);
    a.(j) <- temp
;;

let i = ref 0;;

let extract (a:int array) =
    Printf.printf "%d\n" a.(0);
    a.(0) <- a.(!i);
    let rec downheap h j =
      let largest = ref j in
      if j*2 <= h then
        begin
          if a.(j*2-1) > a.(j-1) then largest := j*2;
          if j*2+1 <= h && a.(j*2) > a.(!largest-1) then largest := j*2+1;
          if !largest != j then
            begin
              swap a (!largest-1) (j-1);
              downheap h (!largest)
            end
        end
    in downheap !i 1;i := !i-1
;;

let insert (a:int array) n =
    a.(!i+1) <- n;
    let rec upheap j =
        if j = 1 then ()
        else
          begin
            if a.(j/2-1) < a.(j-1) then swap a (j/2-1) (j-1)
            ;upheap (j/2)
          end
    in upheap (!i+2);
    i := !i+1

let () =
  let l = Array.make 2000000 0 in
  let rec read () =
      let op = Scanf.scanf "%s " (fun x -> x) in
      if op = "insert" then
        begin
              let n = Scanf.scanf "%d " (fun x -> x) in
              insert l n;read ()
        end
      else if op = "extract" then begin extract l;read () end
  in read ()
;;