A. Яблочное дерево
Имя входного файла: | stdin |
Имя выходного файла: | stdout |
Ограничение по времени: | 2 s |
Ограничение по памяти: | 256 megabytes |
Валера очень любит есть яблоки и, на его счастье, около дома растет большая яблоня. Валера высокий, но яблоня росла на каком-то удивительном удобрении и выросла огромной, поэтому Валера не всегда может дотянуться до яблока. В один прекрасный день ему надоела эта несправедливость, и он решил написать программу, определяющую, какое яблоко расположено ближе всех к земле.
Яблоня представляет собой набор узлов, соединенных ветками. Из каждого узла либо растут ветки (одна или несколько), либо в этом узле находится яблоко. Развитие яблони начиналось из корневого узла. Узлы яблони пронумерованы числами от 1 до N таким образом, что корень имеет номер 1. Будем считать, что высота, на которой растет яблоко, равна расстоянию (измеренному в количестве веток) от узла, на котором растет это яблоко, до корневого узла.
Всё было бы просто, но яблоня – живой организм, и с течением времени ее структура меняется: появляются новые ветки, отваливаются старые узлы (вместе со всеми ветками и узлами, которые на них держались). Валеру постоянно интересует информация о самом нижнем яблоке, поэтому он хочет получать её после каждого изменения в структуре яблони.
Формат входного файла
В первой строке ввода содержится число узлов яблони N (1 ≤ N ≤ 1,5 *105). В следующих N-1 строках содержится описание веток яблони. Каждая ветка описывается двумя целыми числами ui, vi, обозначающими номера узлов, которые она соединяет (1 ≤ i < N, 1 ≤ ui, vi ≤ N). Гарантируется, что ветки не образуют циклов, а любой узел соединен (напрямую или через другие узлы) ветками с корнем дерева.
В следующей строке содержится целое число T – число событий в <<жизни>> яблони (1 ≤ T ≤ 1,5 *105). Далее идет T строк с описанием событий:
- 1 v u – в узле v выросла новая ветка. Узлу, в котором она заканчивается (а это получается новый узел) присваивается номер u. В новом узле u сразу же вырастает яблоко. Если при этом в узле v было яблоко, то оно упало и больше никого не интересует.
- 2 v – узел v отделяется от яблони. Вместе с узлом v отделяется и все, что непосредственно или косвенно за него держалось. Если в узле, за который держался узел v, не осталось веток (кроме идущей к корню), то там вырастает яблоко.
Гарантируется, что все события корректны, то есть узел с номером v есть в дереве, узла с номером u нет в дереве, а корень дерева никогда не будет отделен. Все числа положительны и не превосходят 1,5 *105.
Обратите внимание, что если какой-то узел оказывается отделен от дерева, то его номер может быть потом использован для обозначения нового узла.
Формат выходного файла
После каждого события необходимо вывести в отдельной строке единственное число – номер наиболее близкого к корню узла, в котором есть яблоко. Если ответов несколько, то можно вывести любой.
Пример:
стандартный поток ввода | стандартный поток вывода |
---|---|
4 1 3 1 4 2 3 6 2 2 1 4 2 1 3 5 1 5 6 2 5 2 2 | 4 3 2 2 3 3 |
Источник: Чемпионат ПетрГУ по программированию. Октябрь 2014.
Обсудить
Отправить решение