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 MAX 2000000

int arr, A[MAX+1];

void maxHeapify(int x){

  int l, r, t, max;

  l = 2 * x;

  r = 2 * x + 1;

  if ( l <= arr && A[l] > A[x] ) max = l;

  else max = x;

  if ( r <= arr && A[r] > A[max] ) max = r;

  if ( max != x ){

    t = A[x];

    A[x] = A[max];

    A[max] = t;

    maxHeapify(max);

  }

}


int extract(){

  int ans;

  if ( arr < 1 ) return;

  ans = A[1];

  A[1] = A[arr--];

  maxHeapify(1);

  return ans;

}

void increaseKey(int x, int key){

  int tmp;

  if ( key < A[x] ) return;

  A[x] = key;

  while ( x > 1 && A[x/2] < A[x] ){

    tmp = A[x];

    A[x] = A[x/2];

    A[x/2] = tmp;

    x = x / 2;

  }

}

void insert(int key){

  arr++;

  A[arr] = -1000000001;

  increaseKey(arr, key);

}


int main(){
  int key;
  char array[20];
  while(1){
    scanf("%s", array);
    if ( array[0] == 'i' ){
      scanf("%d", &key);
      insert(key);
    } else if ( strcmp(array, "extract") == 0  ){
      printf("%d\n", extract());
    } else break;
  }

  return 0;

}