class PriorityQueue
    def initialize()
        @heap_size = 0
        @heap_tail = 0
        @heap_data = [0]
    end
    def empty
        @heap_tail == 0
    end
    def size
        @heap_size
    end

    def push(value)
        @heap_tail += 1
        @heap_data[@heap_tail] = value
        f = @heap_tail
                #把新插入的节点往上提
        while f != 1 && value > @heap_data[f>>1]  #可以向上去
            @heap_data[f] = @heap_data[f>>1]
            @heap_data[f>>1] = value
            f >>= 1
        end
    end
    def top
        @heap_data[1]  #最大元素在顶端
    end
    def pop
        @heap_data[1] = @heap_data[@heap_tail]
        f = 1
        tmp = @heap_data[@heap_tail]
        @heap_tail -= 1
        while (f << 1) <= @heap_tail
            d = @heap_data[f<<1] - @heap_data[f<<1|1]

            #左右节点都比自己小,终止循环
            if d > 0  
                break if @heap_data[f<<1] <= tmp
            else
                break if @heap_data[f<<1|1] <= tmp
            end

            if d > 0  #左孩子大就与左孩子交换,否则和右孩子交换
                @heap_data[f] = @heap_data[f<<1]
                @heap_data[f<<1] = tmp
                f <<= 1
            else
                @heap_data[f] = @heap_data[f<<1|1]
                @heap_data[f<<1|1] = tmp
                f = f<<1|1
            end
        end
    end
end

#test
q = PriorityQueue.new
gets.split.map{|e| e.to_i}.each {|e| q.push(e)}
while !q.empty
    puts q.top
    q.pop
end