$heap = []
$size = 0

# heap実装

def push(x)
  # ヒープが空ならRootに追加して抜ける
  return $heap[0] = x if $heap.empty?
  # 追加されたノードが収まるindex
  i = $size += 1

  while i > 0 do
    parent = (i - 1) / 2
    # 逆転していないなら抜ける
    break if $heap[parent] <= x

    # 親のノードの数字をおろして、自分は上に
    $heap[i] = $heap[parent]
    i = parent
  end

  $heap[i] = x
end

def pop
  return nil if $size < 0
  # returnする最小値を保存
  ret = $heap[0]
  # 最後尾をRootに持っていき、子と比較する
  leaf = $heap[$size]
  # 最後尾が最終的に収まるindex
  i = 0

  while i * 2 + 1 < $size do
    # 子同士を比較
    # 左の子は、自分の番号 * 2 + 1
    # 右の子は、自分の番号 * 2 + 2
    left = i * 2 + 1
    right = i * 2 + 2
    left = right if right < $size && $heap[right] < $heap[left]

    # 逆転していないなら抜ける
    break if $heap[left] >= leaf

    # この数字を持ち上げる
    $heap[i] = $heap[left]
    i = left
  end

  $size -= 1
  $heap[i] = leaf
  ret
end

push(6)
push(3)
push(2)
push(5)
push(1)
push(4)
p pop  # => 1
p pop  # => 2
p pop  # => 3
p pop  # => 4
p pop  # => 5
p pop  # => 6
p pop  # => nil