Обходы бинарного дерева

ограничение по времени на тест
2 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Бинарное дерево — это набор вершин, у каждой из которых может быть левый и правый ребёнок. Одна из вершин является корнем дерева, она не является ребёнком какой-то другой. Начав в корне и каждый раз переходя в одного из детей, можно дойти до любой вершины. Множество вершин, до которых можно дойти из заданной, называется её поддеревом.

У бинарного дерева есть три основных обхода: прямой (pre-order), центрированный (in-order) и обратный (post-order).

Прямой обход дерева — это порядок его вершин, полученный следующим рекурсивным алгоритмом:

  1. Добавить корень дерева в обход.
  2. Если у корня есть левый ребёнок, выписать прямой обход его поддерева.
  3. Если у корня есть правый ребёнок, выписать прямой обход его поддерева.

В центрированном обходе корень дерева выписывается между обходами поддеревьев его детей, в обратном — после обходов поддеревьев его детей.

Обобщим эти три варианта обхода: пусть в каждой вершине записано целое число $x$ от $-1$ до $1$, обозначающее, в какой момент мы выписываем эту вершину, а именно:

  • $x = -1$: до обходов поддеревьев её детей;
  • $x = 0$: между обходами поддеревьев её детей;
  • $x = 1$: после обходов поддеревьев её детей.

Таким образом, если во всех вершинах записано $-1$, обход является прямым, если $0$ — центрированным, если $1$ — обратным.

Рассмотрим дерево с $n$ вершинами, пронумерованных от $1$ до $n$. Корень дерева — вершина $1$. Изначально во всех вершинах записано число $-1$.

В рамках исследования необходимо обработать $q$ запросов одного из следующих типов:

  1. Поменять числа в вершинах $l, l+1, \dots, r$ на $x$ ($x$ равен $-1$, $0$ или $1$).
  2. Сообщить, на какой позиции в текущем обходе будет стоять вершина $i$.

Необходимо вывести ответы на все запросы второго типа.

Входные данные

В первой строке входных данных даны два целых числа $n$ и $q$ ($1 \le n, q \le 100\,000$).

В следующих $n$ строках даны по два целых числа $L_i$ и $R_i$ ($0 \le L_i, R_i \le n$) — номер левого и правого ребёнка вершины $i$ соответственно, либо $0$, если соответствующий ребёнок отсутствует.

Гарантируется, что $L_i$ и $R_i$ задают корректное бинарное дерево.

В следующих $q$ строках даны запросы. Первое число в строке $t$ ($t \in \{1, 2\}$) — тип запроса.

В случае запроса первого типа далее даны целые числа $l$, $r$ и $x$ ($1 \le l \le r \le n$, $x$ равен $-1$, $0$ или $1$) — границы отрезка вершин, в которых меняются числа, и новое значение.

В случае запроса второго типа далее дано число $i$ ($1 \le i \le n$) — номер вершины, позицию которой в обходе необходимо вывести.

Выходные данные

На каждый запрос второго типа выведите единственное число от $1$ до $n$ — позицию соответствующей вершины в обходе.

Система оценки

Пусть $q_1$ — количество запросов первого типа.

|c|c|}

Подзадача

Баллы Дополнительные ограничения Необх. подзадачи Информация о проверке
110 $n,q \le 5000$первая ошибка
25 $q_1 \le 10$первая ошибка
310 все запросы первого типа идут до всех запросов второго типапервая ошибка
410 все листья (вершины без детей) находятся на одном расстоянии от корня, нет вершин с ровно одним ребёнкомпервая ошибка
510 $l = r$ для всех запросов первого типапервая ошибка
620 $x \in \{-1,1\}$ для всех запросов первого типа, у каждой вершины не более одного ребёнкапервая ошибка
710 $x \in \{-1,1\}$ для всех запросов первого типа6первая ошибка
810 у каждой вершины не более одного ребёнка6первая ошибка
915 нет1–8первая ошибка
Пример
Входные данные
5 5
3 4
0 0
5 2
0 0
0 0
2 2
1 1 3 1
2 5
1 3 3 0
2 3
Выходные данные
4
1
2
Примечание

В примере обход меняется следующим образом:

  • $[1, 3, 5, 2, 4]$
  • $[5, 2, 3, 4, 1]$
  • $[5, 3, 2, 4, 1]$

Задача на Codeforces (контест gym/104950, задача 8, © Codeforces.com)