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<iostream>
#include<string>
#include<vector>
using namespace std;
int H=0;
vector<long long> A;
void maxHeapify(long long i){
  int l,r,largest;
      l= 2*i+1;
      r = 2*i+2;
      // 左の子、自分、右の子で値が最大のノードを選ぶ
      if (l <= H && A[l] > A[i]){
          largest = l;
        }
      else{
          largest = i;
        }
      if (r <= H && A[r] > A[largest]){
         largest = r;
       }

     if (largest != i){
         swap(A[i],A[largest]); //を交換
         maxHeapify(largest); // 再帰的に呼び出し
       }
     }
void pushHeap() {
	long long p = H - 1;
	while (p && A[p] > A[(p - 1) / 2]) {
		swap(A[p], A[(p - 1) / 2]);
		p = (p - 1) / 2;
	}
}
int main(){
long long num;
string str;
while(1){
  cin>>str;
  if(str=="insert"){
    cin>>num;
    A.push_back(num);
    H++;
    pushHeap();
  }
  else if(str=="extract"){
    cout<<A[0]<<endl;
			A[0] = A[A.size() - 1];
			A.pop_back();
    H--;
    maxHeapify(0);
  }
    else break;
}
}