- Матроскін, я навчився будувати дерево відрізків. - Шарик, краще б ти зробив нову будку, ніж займався такими дурницями. - Ну, Матроскін, я вже й Дядькові Федору показував код, можеш побачити в попередній задачі, а тобі покажу нову функцію — зміну.
int update(int v, int left, int right, int pos, int val) { if (left == right) t[v] = val; return 0; int mid = (left + right) / 2; if (pos <= mid) update(v * 2, left, mid, pos, val); else update(v * 2 + 1, mid + 1, right, pos, val); t[v] = max(t[v * 2], t[v * 2 + 1]); return 0;}
- Гаразд, Шарику, якщо ти вже написав функцію, слухай. Я дам тобі масив із невід'ємних чисел і набір запитів двох типів: якщо тип запиту дорівнює одиниці, буде дано число , і потрібно знайти такі два числа та (1 \leq l \leq r \leq n), щоб функція, викликана так
get_max(1, 1, n, l, r)
повернула значення, що дорівнює . Якщо таких пар кілька, виведи ту, де найменше . Якщо їх усе ще кілька, виведи з них ту, де менше . Якщо таких пар не існує, виведи рядок "Error". Якщо тип запиту дорівнює двом, далі слідують два числа , , і потрібно виконати функцію так
update(1, 1, n, x, y)
Чи впораєшся із цим завданням? Можеш вважати, що на самому початку була викликана функція
build(1, 1, n)
із попередньої задачі.
- Спробую, Матроскін.
Перший рядок містить одне число (1 \leq n \leq 10^6) — кількість елементів у масиві. У другому рядку розташовано невід'ємних чисел, що не перевищують 10^9 — елементи масиву. Далі записано число (1 \leq m \leq 10^5) — кількість запитів. А потім рядків, кожен з яких містить перше число — тип запиту, далі опис запиту, що складається з одного або двох чисел.
Для кожного запиту типу виведіть відповідь на задачу.
Приклад 1