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: Wrong Answer)

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Heap heap = new Heap();
        int i =0, k;
        String[] actions;
        String action= "";
        while(!(action= in.nextLine()).equals("end")){
            actions = action.split(" ");
            action = actions[0];
            if(action.equals("insert")){
                k = Integer.parseInt(actions[1]);
                heap.insert(k);
            }
            else{
                System.out.println(heap.extract());
            }
        }
    }
}
class Heap {
    private int[] heap;
    private int i;
    Heap(){
        this.heap = new int[2000001];
        this.i =1;
    }
    public void insert(int k){
        this.heap[this.i]=k;
        this.i++;
    }
    public int extract(){
        int answ;
        if(this.i==2){
            answ = this.heap[1];
        }
        else{
            heapfy();
            answ = this.heap[1];
            this.heap[1] = this.heap[(this.i-1)];
            this.heap[(this.i-1)] = answ;
        }
        this.i--;
        return answ;
    }
    private void heapfy(){
        int n = (this.i)-1, v, j, k;
        boolean heap=false;
        for(int i = n/2;i>=1;i--){
            v = this.heap[i];
            k = i;
            while (!heap && 2*k<=n){
                j = 2 *k;
                if(j<n && this.heap[j]<this.heap[j+1]){
                    j++;
                }
                if(v>=this.heap[j]){
                    heap = true;
                }
                else{
                    this.heap[k] = this.heap[j];
                    k = j;
                }
            }
            this.heap[k] = v;
        }
    }
}