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)

// Priority_Queue.cs

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

class Priority_Queue {
	public static void Main() {

		StringBuilder str_b = 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 no = list.Count;
				list.Add(int.Parse(str[1]));

				while(true) {
					if(no == 0) {
						break;
					}

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

					no = id;

				}

				} else if(str[0] == "end") {
					break;
					} else if(str[0] == "extract") {
						str_b.AppendLine(list[0].ToString());
						int no = list.Count - 1;
						list[0] = list[no];
						list.RemoveAt(no);
						int c = 0;
						for(int i = 0; (i = 2 * c + 1) < no;) {
							if((i != no - 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(str_b);
			}
		}