Відсортуємо всі вежі за зростанням координати та будемо проходити зліва направо:
Під час проходження вказівника відкриваємо чергову вежу (x_i,w_i,r_i), додаючи її до структури даних (multiset або priority queue), що впорядковується за правою межею покриття x_i+r_i.
Перед обробкою чергової вежі видаляємо зі структури всі елементи, для яких x_i > x_j + r_j (їхні радіуси вже не дістають до x_i).
У структурі також підтримуємо суму ваг активних ліхтарів S_\mathrm{L}(i) та окремий контейнер, з якого за O(\log n) можна взяти максимальну вагу серед активних, окрім самої вежі — саме такого кандидата доцільно «вимкнути», аби найбільше зменшити і тим самим збільшити .
Далі повторюємо аналогічні кроки, але сортуємо і обходимо вежі справа наліво (рухаючись у зворотному порядку від до ), підтримуючи активність за лівою межею x_i - r_i. На виході маємо значення S_\mathrm{R}(i) та max_R(i) — суму пильності, яку вежа отримує з правої частини, і максимальну вагу серед них відповідно.
Для кожної вежі відомі два найкращі кандидати :
Перебираємо всі вежі , обираючи найменшу ефективну пильність, та підтримуємо глобальний максимум і відповідні індекси . Загальна часова складність O(n\log{n}).