Автор задачі: | Мар'ян Шийка |
Підготував: | Мар'ян Шийка |
Розбір: | Мар'ян Шийка |
Ідея
Нехай
Для зручності переведемо межі запиту [l,r] у координати початкового масиву:
Розглянемо окремо випадки k=1, k=2 та k\ge 3.
k=1
Для поточного значення підтримуватимемо масив
Для L=1 цей масив можна побудувати звичайним проходом зліва направо, підтримуючи поточний MEX.
Розглянемо перехід від до L+1. Нехай
Позначимо через наступну після позицію, на якій зустрічається значення . Якщо такої позиції немає, покладемо p=n+1.
Після видалення a_L значення prefix MEX можуть змінитися лише до наступного входження , тобто на позиціях до p-1.
Нехай — перша позиція, для якої
Тоді після переходу до L+1 на всьому відрізку
новий prefix MEX дорівнюватиме . Отже, потрібно виконати операцію
для всіх i\in[x,p-1].
Для підтримки масиву використаємо дерево відрізків, яке вміє:
присвоювати одне значення всім елементам на відрізку;
знаходити суму на відрізку;
знаходити першу позицію , для якої c_x>v.
Тоді відповідь на запит з k=1 дорівнює
k=2
Нехай
Оскільки масив є неспадним, значення збільшується на одиницю щоразу, коли в вперше з'являється наступне необхідне значення
Позначимо через p_x першу позицію, на якій у з'являється значення .
Число впливає на відповідь лише тоді, коли перші входження утворюють ланцюжок
У такому випадку поява збільшує prefix MEX на всіх позиціях починаючи з p_x. Тобто вона відповідає операції
для всіх
Тому масив можна підтримувати другим деревом відрізків, яке підтримує додавання на відрізку та знаходження суми на відрізку.
При переході від до L+1 змінюється структура перших входжень, а разом з нею може змінитися початковий строго зростаючий ланцюжок
Якщо деякі значення починають належати цьому ланцюжку, для них додаємо відповідні операції
Якщо деякі значення перестають йому належати, виконуємо
Ці зміни можна підтримувати амортизовано, тому сумарна кількість оновлень протягом усього проходу за є лінійною.
Тоді відповідь на запит з k=2 дорівнює
k\ge 3
Після третього застосування операції масив гарантовано стає константним.
Якщо a_L=0, то перший елемент дорівнює , тому в взагалі немає нуля. Отже,
а
Якщо a_L\ne0, то перший елемент дорівнює . Після ще одного застосування усі елементи отриманого масиву додатні, тому
Далі кожне застосування просто змінює константний масив з нулів на константний масив з одиниць і навпаки.
Таким чином, для k\ge3
тоді і тільки тоді, коли
В іншому випадку
Отже, відповідь на запит з k\ge3 дорівнює або
або .
Складність
Обробляємо значення послідовно від до .
Для k=1 кожен перехід виконується за O(\log n).
Для k=2 кожне оновлення дерева відрізків займає O(\log n), а сумарна кількість необхідних змін є амортизовано лінійною.
Кожен запит з k=1 або k=2 обробляється за O(\log n), а запит з k\ge3 — за .
Отже, загальна асимптотика — O((n+q)\log n).
Використання пам'яті — O(n+q).