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 JAVA (judge verdict: Time Limit Exceeded)

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
 
public class Main {
    static ArrayList<Integer> A = new ArrayList<Integer>();
    static void maxHeapify(ArrayList<Integer> A, int k){
        int l = 2*k;
        int r = 2*k+1;
        int largest = 0;
     
        if ((l <= (A.size() - 1)) && (A.get(l) > A.get(k))){
            largest = l;
        }else{
            largest = k;
        }
        if ((r <= (A.size() - 1)) && (A.get(r) > A.get(largest))){
            largest = r;
        }
        if (largest != k){
            int tmp = A.get(k);
            A.set(k, A.get(largest));
            A.set(largest, tmp);
            maxHeapify(A, largest);
        }
    }
     
    static void buildMaxHeap(ArrayList<Integer> A){
        for (int i=(A.size()-1)/2; i>=0; i--){
            maxHeapify(A,i);
        }
    }        
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         
        while (true){
            String[] line = br.readLine().split(" ");
            String order = line[0];
            if (order.equals("end")) break;
            if (order.equals("insert")){
                int num = Integer.parseInt(line[1]);
                A.add(num);
            }else if (order.equals("extract")){
                buildMaxHeap(A);
                System.out.println(A.get(0));
                A.remove(0);
            }else{ // end
                break;
            }
        }
    }
}