Вы меня извините, при всём уважении, вы - говнокодер. С этим надо что-то делать, для начала - признать этот факт. Возьмём самую длинную строку:
reader = (tuple(map(str, line.split())) for line in stdin)
чем она отличается от
reader = (tuple(line.split()) for line in stdin)
Ответ - вызовом
map, который бессмысленно переводит
str в
str. Вы зачем это сделали? Там в задании (я не поленился, погуглил) был шаблон решения с рабочим проверочным кодом, а вы зачем-то заменили его странным не буду повторять чем.
По существу: сложность алгоритма оценивается не измерениями, а мозгами.
_heapify_max, комментарии в исходниках:
""" Maxheap variant of heapify. """
Смотрим
heapify:
""" Transform list into a heap, in-place, in O(len(heap)) time. """
И где тут
O(logn)?
Попробуйте придумать нормальное решение.