Розбір
Перший важливий факт для розв'язання цієї задачі — змінюється не більше, ніж разів. Це можна просто показати, нехай в нас , де . Тепер, якщо , то (бо ділить ), тобто хоча б , що значить, що кожен раз коли змінюється, воно зменшується хоча б вдвічі.
Тепер, давайте для кожної позиції знайдемо позиції зліва і справа, де змінюється. Але, треба запам'ятати для кожного останню позицію, так, щоб довжина відрізка [] чи [] була максимальною. Для кожної позиції в нас є позицій, де змінюється.
Зафіксуймо праву границю , тоді щоб відповідати на запити підтримуймо масив , що — найбільша відповідь для відрізків, що мають ліву границю в , і їх права границю менше рівна .
Щоб відповісти на запит питаємо максимум в масиві на відрізку і треба перевірити всі відрізки, які починались в цьому відрізку, але закінчились лівіше. Тоді точно було взято у відрізок, то перевіримо всі відрізки, де змінюється справа від .
Таке можна розв'язувати офлайн за допомогою дерева відрізків і сортуванням запитів, чи онлайн, за допомогою персистентного дерева відрізків.
Розв'язок з персистентним деревом відрізків має асимптотику . Інші розв'язки, які відомі мені, мають таку саму асимптотику, але кращу константу, що робить їх значно швидшими.
На початку планувалось зробити всі запити онлайн щоб було цікавіше розв'язувати задачу, але через деякі причини було вирішено зробити задачу стандартною — хто хоче розв'язувати офлайн — нехай розв'язує