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>
#include<string.h>
#include<stdlib.h>
#define MAX 2000001

int H;

void insert(int A[], int key) {
    H++;
    A[H] = -1;
    heapIncreaseKey(A, H, key);
}

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

int heapIncreaseKey(int A[], int i, int key) {
    int tmp;
    if (key < A[i]) return -1;
    
    A[i] = key;
    while (i > 1 && A[parent(i)] < A[i]) {
	tmp = A[i]; A[i] = A[parent(i)]; A[parent(i)] = tmp;
	i = parent(i);
    }
}

void maxHeapify(int A[], int i) {
    int l, r, largest, tmp;
    l = 2*i;
    r = 2*i + 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) {
	tmp = A[i]; A[i] = A[largest]; A[largest] = tmp;
	maxHeapify(A, largest);
    }
}

int heapExtractMax(int A[]) {
    if (H < 1) return -1;
    
    int max = A[1];
    A[1] = A[H];
    H--;
    maxHeapify(A, 1);

    return max;
}


int main() {
    int flag,key,max, len;
    char str[10];

    int *A;
    A = malloc(sizeof(int) * MAX);
    flag=1; 
    H=0;
    while(1){
	scanf("%s", str);
	len = strlen(str);
	if(len == 3) {
	    break;
	}
	else if (len == 6) {
	    scanf("%d", &key);
	    insert(A, key);
	}
	else if(len == 7) {
	    max = heapExtractMax(A);
	    printf("%d\n", max);
	}
      
    }

    return 0;
}