public class MinHeap {
    private int[] Heap;
    private int maxsize;
    private int size;

    public MinHeap(int max) {
	maxsize = max;
	Heap = new int[maxsize];
	size = 0 ;
	Heap[0] = Integer.MIN_VALUE;
    }

    private int leftchild(int pos) {
	return 2*pos;
    }
    private int rightchild(int pos) {
	return 2*pos + 1;
    }

    private int parent(int pos) {
	return  pos / 2;
    }
    
    private boolean isleaf(int pos) {
	return ((pos > size/2) && (pos <= size));
    }

    private void swap(int pos1, int pos2) {
	int tmp;

	tmp = Heap[pos1];
	Heap[pos1] = Heap[pos2];
	Heap[pos2] = tmp;
    }

    public void insert(int elem) {
	size++;
	Heap[size] = elem;
	int current = size;
	
	while (Heap[current] < Heap[parent(current)]) {
	    swap(current, parent(current));
	    current = parent(current);
	}	
    }

    public void print() {
	int i;
	for (i=1; i<=size;i++)
	    System.out.print(Heap[i] + " ");
	System.out.println();
    }

    public int removemin() {
	swap(1,size);
	size--;
	if (size != 0)
	    pushdown(1);
	return Heap[size+1];
    }

    private void pushdown(int position) {
	int smallestchild;
	while (!isleaf(position)) {
	    smallestchild = leftchild(position);
	    if ((smallestchild < size) && (Heap[smallestchild] > Heap[smallestchild+1]))
		smallestchild = smallestchild + 1;
	    if (Heap[position] <= Heap[smallestchild]) return;
	    swap(position,smallestchild);
	    position = smallestchild;
	}
    }

}