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)

#include<stdio.h>
#define N 2000000

int H[N];
int top=0;

void swap(int a,int b){
	int temp=H[a];
	H[a]=H[b];
	H[b]=temp;
	return;
}

void up_to_heap(){
	
	int i=top-1;
	while(i>0){
		if(i%2==0){
			if(H[i] > H[i/2-1]){
				swap(i,i/2-1);
				i=i/2-1;
			}
			else break;
		}
		else {
			if(H[i] > H[i/2]){
				swap(i,i/2);
				i=i/2;
			}
			else break;
		}
	}
	return;

}

int is_leaf(int i){
	if(top/2 <= i && i < top)return 1;
	return 0;
}

void down_to_heap(){
	int i=0;
	
	while(!is_leaf(i)){
		if(i*2+1==top-1){
			if(H[i] < H[i*2+1]){
				swap(i,i*2+1);
			}
			break;
		}
		else {
			if(H[i*2+1] < H[i*2+2]){
				if(H[i] <H[i*2+2]){
					swap(i,i*2+2);
					i=i*2+2;
				}
				else break;
			}
			else {
				if(H[i] < H[i*2+1]){
					swap(i,i*2+1);
					i=i*2+1;
				}
				else break;
			}
		}
	}
	
	return;
	
}

void extractMax(){
	printf("%d\n",H[0]);
	swap(0,top-1);
	top--;
	down_to_heap();
	return;
}


void insert(int x){
	H[top++]=x;
	up_to_heap();
	
	return;
}

int main(){
	char com[10];
	int x;
	
	while(scanf("%s",com)!=EOF){
		if(com[2]=='d')break;
		
		if(com[0]=='i'){
			scanf("%d",&x);
			insert(x);
		}
		
		if(com[1]=='x')
			extractMax();
	}
	
	return 0;
	
}