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 error -1
int size=0,list[2000000];

int parent(int i){
   return i/2;
}

int Left(int i){
  return 2*i;
 }

int Right(int i){
  return 2*i+1;  
 }

void maxHeapify(int i){
  int left,right,largest,key;
  left=Left(i);
  right=Right(i);
  
  if(left<=size && list[left]>list[i])
    largest=left;
  else largest=i;
  
  if(right<=size && list[right]>list[largest])
    largest=right;
  
  if(largest!=i){
    key=list[i];
    list[i]=list[largest];
    list[largest]=key;
    maxHeapify(largest);
  }  
}







void heapIncrease(int i,int key){
  int ch;
  if(key<list[i]) return;
  list[i]=key;
  while(i>0 && list[parent(i)]<list[i]){
    ch=list[i];
    list[i]=list[parent(i)];
    list[parent(i)]=ch;
    i=parent(i);
  }
  return;
}


void insert(int key){
  size=size+1;
  list[size]=-1000000;
  heapIncrease(size,key);
}


int heapExtractMax(){
  int max;
  if(size<0) return error;
  max=list[0];
  list[0]=list[size];
  size=size-1;
  maxHeapify(0);
  return max;
}
 
int main(){
  char Inst[10];
  int count,del,key;
 
 while(1){
   
   scanf("%s %d",Inst,&key);
   if(Inst[0]=='i') insert(key);
   else if(Inst[1]=='x'){
     del=heapExtractMax();
     printf("%d\n",del);
   }
   else if(Inst[2]=='d') break;

 }
 return 0;
}