Машмох долго тужился и в конце концов придумал задачу. Теперь ваша задача — решить ее.
Дано корневое дерево T с n вершинами. У каждой вершины есть уникальный номер от 1 до n. Корень T имеет номер 1. Для каждой вершины данного дерева v задан список ее детей в определенном порядке. Вы должны эффективно выполнять следующие запросы:
- найти расстояние (количество ребер в кратчайшем пути) от u до v;
- заданы v и h, требуется отсоединить вершину v от ее родителя и присоединить к ее h-му предку; более формально, обозначим путь от v до корня как x1, x2, ..., xl (h < l), в таком случае x1 = v, а xl — это корень; требуется отсоединить v от ее родителя (x2) и присоединить ее к xh + 1; при этом вершина v добавляется в конец списка детей вершины xh + 1.
- в последовательности вершин, полученной вызовом функции dfs(root), найдите последнюю вершину, находящуюся на расстоянии k от корня.
Псевдокод функции dfs(v) выглядит следующим образом:
// ls[v]: список детей вершины v
// его i-й элемент ls[v][i]
// его размер size(ls[v])
sequence result = empty sequence; //результат равен пустой последовательности
void dfs(vertex now)
{
add now to end of result; // добавить now в конец result
for(int i = 1; i <= size(ls[v]); i = i + 1) //цикл от i = 1 до i = size(ls[v])
dfs(ls[v][i]);
}
Выходные данные
Для каждого запроса первого или третьего типа выведите одну строку, содержащую ответ на запрос.
Примеры
| № | Входные данные | Выходные данные |
|
1
|
4 9 1 2 1 3 1 4 0 1 1 4 2 4 2 1 3 4 3 1 3 2 2 3 2 1 1 2 3 1 3 2
|
3
2
2
4
1
3
4
|
|
2
|
2 2 1 2 0 1 2 1 3 1
|
1
2
|