Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 

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

(Время: 5 сек. Память: 128 Мб Сложность: 75%)

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

У бинарного дерева есть три основных обхода: прямой (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, ..., r на x (x равен −1, 0 или 1).
  2. Сообщить, на какой позиции в текущем обходе будет стоять вершина i.

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

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

В первой строке входного файла INPUT.TXT заданы два целых числа n и q (1 ≤ n, q ≤ 100 000).

В следующих n строках даны по два целых числа Li и Ri (0 ≤ Li, Ri ≤ n) – номер левого и правого ребёнка вершины i соответственно, либо 0, если соответствующий ребёнок отсутствует.

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

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

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

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

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

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

Пример

INPUT.TXTOUTPUT.TXT
15 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]

Для отправки решения задачи необходимо зарегистрироваться и авторизоваться!

[Обсуждение] [Все попытки] [Лучшие попытки]


 Язык программирования C++
 Решение олимпиадных задач
 Региональные олимпиады
 Книги Фёдора Меньшикова
 Тренировочные олимпиады
 Школьный этап
 Муниципальный этап
 Региональный этап
 Полуфинал ВКОШП
 Личное первенство СФУ
 2006 / 2007
 2007 / 2008
 2008 / 2009
 2009 / 2010
 2010 / 2011
 2011 / 2012
 2012 / 2013
 2013 / 2014
 2014 / 2015
 2015 / 2016
 2016 / 2017
 2017 / 2018
 2018 / 2019
 2019 / 2020
 2020 / 2021
 2021 / 2022
 2022 / 2023
 2023 / 2024
 A. Посадка в самолет
 B. Битоническая последовательность
 C. Игра с таблицей
 D. Выбор столицы
 E. Разбиение массива
 F. Бактерии
 G. Разбиение на тройки
 H. Обходы бинарного дерева

Красноярский краевой Дворец пионеров, (c)2006 - 2024, ИНН 246305493507, E-mail: admin@acmp.ru