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

using System;
using System.Collections.Generic;
using System.Text;

class C9{
  public static void Main(){
    StringBuilder sb = new StringBuilder();
    string[] str = new string[2];
    var<int> list = new List<int>();

    while(true){
      str = Console.ReadLine().Split(' ');

      if(str[0][0] == 'i'){
        int n = list.Count;
        list.Add(int.Parse(str[1]));

        while(true){
          if(n == 0) break;

          int id = (n - 1) / 2;
          if(list[n] > list[id]){
            int temp = list[n];
            list[n] = list[id];
            list[id] = temp;
          }

          n = id;
        }
      }else if(str[0] == "end") break;
      else if(str[0] == "extract"){
        sb.AppendLine(list[0].ToString());
        int n = list.Count - 1;
        list[0] = list[n];
        list.RemoveAt(n);
        int c = 0;
        for(int i = 0;(i = 2 * c + 1) < n;){
          if((i != n - 1) && (list[i] < list[i + 1])) i++;
          if(list[c] < list[i]){
            int temp = list[i];
            list[i] = list[c];
            list[c] = temp;
          }
          c = i;
        }
      }
    }
    Console.Write(sb);
  }
}