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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main{
	public static void main(String[] args) throws IOException {
		heap hoge=new heap(2000000);
		BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
		String unko="";
		String[] bu=new String[2];
		while(true) {
			unko=bfr.readLine();
			if(unko.equals("end")) {
				System.exit(0);
			}
			else if(unko.charAt(0)=='i'){
				bu=unko.split(" ");
				long a=Long.parseLong(bu[1])*(-1);
				hoge.heap_push(a);
			}
			else {
				long aa=hoge.heap_pop();
				System.out.println(aa*-1);
			}
		}
	}

	static class heap{

		static int sz;		//現在のヒープに埋まっている数

		static long[] heap;

		public heap(int size) {
			sz=0; heap=new long[size];
		}

		int size() {		//サイズをかえす
			return sz;
		}

		void heap_push(long a) {		//ヒープに入れる
			int i=sz++;
			while(i>0) {	//今指しているヒープがルートに来るまで続ける
				int parent=(i-1)/2;
				if(heap[parent]<=a) {
					break;
				}
				heap[i]=heap[parent];
				i=parent;
			}
			heap[i]=a;
		}

		long heap_pop() {
             //小さい順から取り出す
			long ret=heap[0];
			long x=heap[--sz];
			int i=0;
			while(i*2+1<sz) {	//最下層の葉っぱまで行くまで続ける
				int a=i*2+1,b=i*2+2;		//aは左の葉っぱ、bは右の葉っぱ
				if(b<sz && heap[b]<heap[a]) {
					a=b;
				}
				if(heap[a]>=x) {
					break;
				}
				heap[i]=heap[a];
				i=a;
			}
			heap[i]=x;
			return ret;
		}
	}
}