# Задача 11 — куча: построение за O(n) и top-K (C++) Куча **max-heap** в массиве (для элемента `i` дети — `2i+1`, `2i+2`), без `std::priority_queue`. ```c++ void heapify(std::vector& a); // перестроить массив в кучу int kth_largest(const std::vector& a, int k); // k >= 1 std::vector top_k(const std::vector& a, int k); // k наибольших, по убыванию ``` Требования: - `heapify` — **просеивание снизу вверх (bottom-up), O(n)**, а не `push` в цикле (это O(n log n)); проверка свойств кучи машинная, требование по сложности я сверяю глазами по коду — на собеседовании спросят именно это; - `heapify` обязан сохранить мультимножество элементов (ничего не терять и не дублировать); - `k` в границах `1..n`; при `k > n` — `top_k` возвращает все по убыванию, `kth_largest` при `k > n` возвращает значение минимального элемента (то есть не падает); - 3 000 000 элементов: `heapify` быстрее 2 секунд, `kth_largest` с `k = 1000` быстрее 2 секунд. Проверка: `python3 grade.py 11`. Критерий: все `ok`, сборка без предупреждений, ASAN/UBSAN чистые. Разбор после сдачи: почему снизу вверх выходит сумма геометрической прогрессии; когда нужен min-heap размера k (top-K на потоке); чем `nth_element` отличается от кучи.