#include #include #include using pint = std::pair; int main() { std::vector> layers; // Konstrukce původní pyramidy int pyramid_height; std::cin >> pyramid_height; for (int i = 0; i < pyramid_height; ++i) { int delka_vrstvy = 1 << i; layers.push_back(std::priority_queue()); for (int j = 0; j < delka_vrstvy; ++j) { pint newcomer; std::cin >> newcomer.first; newcomer.second = j; layers[i].push(newcomer); } } // Příchozí studenti int queries; std::cin >> queries; for (int q = 0; q < queries; ++q) { int newcomer_height; std::cin >> newcomer_height; // Prubezne maximum int picked_layer = 0; double picked_diff = newcomer_height - layers[0].top().first; // Zkusíme rozdil v každem patře for (int i = 1; i < pyramid_height; ++i) { int delka_vrstvy = 1 << i; double height_diff = newcomer_height - layers[i].top().first; double impact = height_diff / delka_vrstvy; if (impact < picked_diff) { picked_layer = i; picked_diff = impact; } } // Zapamatujeme si zvolené místo int picked_index = layers[picked_layer].top().second; // Uložíme příchozího studenta do pyramidy layers[picked_layer].pop(); layers[picked_layer].push(pint(newcomer_height, picked_index)); std::cout << picked_layer << " " << picked_index << "\n"; } }