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>

int cur, heap[2000000];

void maxHeapify (int in) {
  int left, right, max, temp;
  left = 2 * in;
  right = (2 * in) + 1;

  if (left <= cur && heap[left] > heap[in])
    max = left;
  else
    max = in;

  if (right <= cur && heap[right] > heap[max])
    max = right;

  if (max != in) {
    temp = heap[in];
    heap[in] = heap[max];
    heap[max] = temp;
    maxHeapify(max);
  }
}

int extract() {
  int maxVal;

  if(cur < 1)
    return -1;

  maxVal = heap[1];
  heap[1] = heap[cur--];
  maxHeapify(1);

  return maxVal;
}

void increaseVal(int i, int val) {
  int temp;

  if(val < heap[i])
    return;

  heap[i] = val;

while (i > 1 && heap[i/2] < heap[i]) {
    temp = heap[i];
    heap[i] = heap[i/2];
    heap[i/2] = temp;
    i = i/2;
  }
}

void insert(int val) {
  heap[++cur] = -1;
  increaseVal(cur, val);
}

int main() {
  int val;
  char command[20];

  scanf("%s", command);

  while (strcmp(command, "end")) {
    if (!strcmp(command, "insert")) {
      scanf("%d", &val);
      insert(val);
    } else
      printf("%d\n", extract());

    scanf("%s", command);
  }
}