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

#include<bits/stdc++.h>
using namespace std;
int h=0,x;
string s;
int a[2000002];
void add(int i){
	 int t;
	 while (i!=0){
	 	   if (a[i/2]<a[i] && i/2!=0){
	 	       t=a[i]; a[i]=a[i/2]; a[i/2]=t;	
		   }
		   else
		      break;
		   i/=2;
	 }
}
void maxheap(int i){
	 int l=2*i,t,m=i;
	 if (a[l]>a[i] && l<=h)
	    m=l;
	 if (a[l+1]>a[m] && (l+1)<=h)
        m=l+1;
     if (m!=i){
     	t=a[i]; a[i]=a[m]; a[m]=t;
	    maxheap(m);
	 }
}
int main(){
	while (s!="end"){
		  cin>>s;
		  if (s[0]=='i'){
		  	 cin>>a[++h];
		  	 add(h);
		  }
		  if (s[1]=='x'){
		  	 cout<<a[1]<<endl;
		  	 a[1]=a[h];
		  	 h--;
		  	 maxheap(1);
		  }
	}
    return 0;
}