public class Heap {
  private boolean maxheap;               // true => maxheap, false => minheap
  private static final int MAXSIZE = 100;
  private Order[] array = new Order[MAXSIZE];  
  private int size = 0;
  private int maxsize = MAXSIZE - 1; 
  
  public Heap(boolean maxheap) {
    this.maxheap = maxheap;
  }
  public int size() {
    return size;
  }
  public void put(Order order) {         // add new element at end, restore heap
  int i;
    if (size < maxsize) {
      i = ++size;
      if (maxheap)
        while ((i > 1) && (array[i/2].PRICE < order.PRICE)) {  // i/2 is the parent
          array[i] = array[i/2];
          i /= 2;                                              // i becomes the parent
        }
      else
        while ((i > 1) && (array[i/2].PRICE > order.PRICE)) {
          array[i] = array[i/2];
          i /= 2;
        }
      array[i] = order;
    }
  }
  public Order testRoot() {              // retrieve root
    if (size == 0)
      return null;
    else
      return (array[1]);
  }
  public Order getRoot() {               // retrieve root, remove root, restore heap
    if (size == 0)
      return null;
    else {
      Order root = array[1];
      Order last_element = array[size--];
      int i = 1;
      while (2*i <= size) {                                    // 2*i is left child
        int child = 2*i;
        if (child != size)                                     // find smaller child
          if (maxheap) {
            if (array[child+1].PRICE > array[child].PRICE)     // child+1 is right child
              child++;
          } 
          else
            if (array[child+1].PRICE < array[child].PRICE)
              child++;
        if (maxheap) {                         
          if (last_element.PRICE < array[child].PRICE)         // percolate one level
            array[i] = array[child];
          else
            break;
        }
        else
          if (last_element.PRICE > array[child].PRICE)
            array[i] = array[child];
          else
            break;
        i = child;
      }
      array[i] = last_element;
      return(root);
    }
  }
}