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: Time Limit Exceeded)

#include <stdio.h>
#include <string.h>
#define MAX 20000000
#define INF (1<<30)

int h, a[MAX+1];


void swap(int *a, int *b){
  int tmp;

  tmp = *a;
  *a = *b;
  *b = tmp;
}


void maxh(int i){
  int l, r, largest;

  l = 2 * i;
  r = l + 1;

  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]);

  maxh(largest);
}

int ext(void){
  int maxv;

  if(h<1) return -INF;

  maxv = a[1];

  a[1] = a[h--];

  maxh(1);

  return maxv;
}

void inc(int i, int key){
  if(key<a[i]) return;

  a[i] = key;

  while(i>1 && a[i/2]<a[i]){
    swap(&a[i],&a[i/2]);

    i = i/2;
  }
}


void insert(int key){
  h++;

  a[h] = -INF;

  inc(h,key);
}

int main(){
  int key;
  char com[10];

  while(1){
    scanf("%s",com);

    if(com[0]=='e' && com[1]=='n')
      break;

    if(com[0]=='i'){
      scanf("%d",&key);
      insert(key);
    } else printf("%d\n",ext());
  }
  return 0;
}