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.util.Scanner;

public class Main {
	public static Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
		PriorQueue que = new PriorQueue();
		String op = null;
		int x = 0;
		while(true) {
			op = sc.next();
			if(op.equals("insert")) {
				x = sc.nextInt();
				que.insert(x);
			}else if(op.equals("extract")) {
				System.out.println(que.pop());
			}else {
				break;
			}
		}
	}

	
}
class PriorQueue{
	
	int value[] = new int[30000000];
	int h = 0;
	
	public void insert(int x) {
		h++;
		value[h] = x;
		int index = h;
		
		while(index>1 && value[index]>value[index/2]) {
			value[index] ^= value[index/2];
			value[index/2] ^= value[index];
			value[index] ^= value[index/2];
			index /= 2;
		}
		return;
	}
	
	public int pop() {
		int result = value[1];
		value[1] = value[h];
		h--;
		
		int index = 1;
		while(index<=h) {
			int l = index * 2;
			int r = index * 2 + 1;
			int maxi = index;
			if(l<=h && value[l]>value[maxi]) {
				maxi = l;
			}
			if(r<=h && value[r]>value[maxi]) {
				maxi = r;
			}
			if(maxi != index) {
				value[maxi] ^= value[index];
				value[index] ^= value[maxi];
				value[maxi] ^= value[index];
				index = maxi;
			}else {
				break;
			}
		}
		
		return result;
	}
	
	public int top() {
		return value[1];
	}
	
	public boolean isEmpty() {
		return h==0;
	}
	
}