Задача №115221. Обходы бинарного дерева

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

У бинарного дерева есть три основных обхода: прямой ( 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\) — количество запросов первого типа.

Подзадача Баллы Дополнительные ограничения Необх. подзадачи Информация о проверке
1 10 \(n,q \le 5000\) первая ошибка
2 5 \(q_1 \le 10\) первая ошибка
3 10 все запросы первого типа идут до всех запросов второго типа первая ошибка
4 10 все листья (вершины без детей) находятся на одном расстоянии от корня, нет вершин с ровно одним ребёнком первая ошибка
5 10 \(l = r\) для всех запросов первого типа первая ошибка
6 20 \(x \in \{-1,1\}\) для всех запросов первого типа, у каждой вершины не более одного ребёнка первая ошибка
7 10 \(x \in \{-1,1\}\) для всех запросов первого типа 6 первая ошибка
8 10 у каждой вершины не более одного ребёнка 6 первая ошибка
9 15 нет 1–8 первая ошибка

Примечание

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

  • \([1, 3, 5, 2, 4]\)
  • \([5, 2, 3, 4, 1]\)
  • \([5, 3, 2, 4, 1]\)
Примеры
Входные данные
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
Сдать: для сдачи задач необходимо войти в систему