E. Как Машмох задачи придумывал
ограничение по времени на тест
4 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Машмох долго тужился и в конце концов придумал задачу. Теперь ваша задача — решить ее.

Дано корневое дерево T с n вершинами. У каждой вершины есть уникальный номер от 1 до n. Корень T имеет номер 1. Для каждой вершины данного дерева v задан список ее детей в определенном порядке. Вы должны эффективно выполнять следующие запросы:

  1. найти расстояние (количество ребер в кратчайшем пути) от u до v;
  2. заданы v и h, требуется отсоединить вершину v от ее родителя и присоединить к ее h-му предку; более формально, обозначим путь от v до корня как x1, x2, ..., xl (h < l), в таком случае x1 = v, а xl — это корень; требуется отсоединить v от ее родителя (x2) и присоединить ее к xh + 1; при этом вершина v добавляется в конец списка детей вершины xh + 1.
  3. в последовательности вершин, полученной вызовом функции 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]);
}
Входные данные

В первой строке записано два целых числа через пробел n, m (2 ≤ n ≤ 105; 1 ≤ m ≤ 105), — количество вершин T и количество запросов, которые надо выполнить.

В i-й из n следующих строк записано целое число li (0 ≤ li ≤ n), количество детей i-й вершины. Затем следует li целых чисел через пробел, j-е число является номером j-го ребенка i-й вершины. Обратите внимание, что порядок этих вершин имеет значение.

Каждая из m следующих строк имеет один из следующих форматов: «1 v u», «2 v h», или «3 k». Первое число в строке обозначает тип запроса. Следующие числа — это описание запроса.

Гарантируется, что все запросы корректны. Например, в запросе второго типа h не меньше 2 и не больше расстояния от v до корня. Также в запросе третьего типа есть хотя бы одна вершина на расстоянии k от корня на момент запроса.

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

Для каждого запроса первого или третьего типа выведите одну строку, содержащую ответ на запрос.

Примеры
Входные данные
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
1 2
0
1 2 1
3 1
Выходные данные
1
2