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 <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
 
#define mp       make_pair
#define pb       push_back
#define all(x)   (x).begin(),(x).end()
#define rep(i,n) for(int i=0;i<(n);i++)
 
using namespace std;
 
typedef    long long          ll;
typedef    unsigned long long ull;
typedef    vector<bool>       vb;
typedef    vector<int>        vi;
typedef    vector<vb>         vvb;
typedef    vector<vi>         vvi;
typedef    pair<int,int>      pii;
 
const int INF=1<<29;
const double EPS=1e-9;
 
const int dx[]={1,0,-1,0},dy[]={0,-1,0,1};

int tree[20000000];
int N = 0;

void maxHeapify(int i) {
	int l = i * 2 + 1;
	int r = i * 2 + 2;
	int largest = i;
	if (l < N && tree[l] > tree[largest]) largest = l;
	if (r < N && tree[r] > tree[largest]) largest = r;

	if (largest != i) {
		int temp = tree[i];
		tree[i] = tree[largest];
		tree[largest] = temp;
		maxHeapify(largest);
	}
}

void insert(int i) {
	if (i == 0) return;
	int parent = (i - 1) / 2;
	if (tree[parent] < tree[i]) {
		int temp = tree[parent];
		tree[parent] = tree[i];
		tree[i] = temp;
		insert(parent);
	}
}

int main(int argc, char const *argv[]) {
	string s;
	do {
		cin >> s;
		if (s == "insert") {
			int value;
			cin >> value;
			tree[N] = value;
			insert(N);
			N++;
		} else if (s == "extract"){
			int value = tree[0];
			tree[0] = tree[N - 1];
			N--;
			maxHeapify(0);
			cout << value << endl;
		}
	} while(s != "end");

	return 0;
}