РСОП XXVII 2015
12
E.
ROOTED TREE
77
Условие
Е. КОРЕНОВО ДЪРВО
---
Всяко дърво (т.е. свързан граф без цикли) можем да превърнем в кореново дърво, като изберем един от върховете, да го означим с r, за корен. Добре известно е, че всеки два върха на дърво са свързани с единствен път и броя на ребрата по този път наричаме разстояние между двата върха. Ако върхът u е на разстояние d от r, върхът v е на разстояние d + k от r, k > 0, и u е на пътя от r до v, тогава u се нарича k-ти предшественик на v, а v – наследник на u. Върховете, които нямат наследници, се наричат листа на кореновото дърво. Напишете програма, която по зададено кореново дърво изпълнява следните заявки:
- 0 x y – добавя в дървото нов лист x, като го свързва с ребро към y;
- 1 x – премахва листа x от дървото;
- 2 x k – запитване за k-тия предшественик на x.
Вход:
Програмата трябва да може да обработва няколко примера при едно изпълнение. На първия ред на стандартния вход ще бъде зададен броят T на тестовите примери. Първият ред на всеки от тях ще съдържа броя N на върховете на зададеното кореново дърво и броя Q на заявките. Следват N реда с по две числа x и y, указващи че x e пряк наследник (дете) на y. Когато у е 0, това означава, че x e корен на дървото (т.е няма баща). Следват Q реда, съдържащи по един от трите типа заявки, споменати по-горе.
Изход:
За всяка заявка от тип 2, програмата трябва да изведе на стандартния изход k-тия предшественик на x. Ако такъв предшественик не съществува или в дървотоняма връх x, тогава програмата трябва да изведе 0.
Ограничения:
1 ≤ N ≤ 10^5, 1 ≤ Q ≤ 10^5, 1 ≤ x ≤ 10^5, 0 ≤ y < 10^5, 1 ≤ k ≤ 10^5.
Примерен вход:
1
8 11
4 0
1 4
7 1
3 2
2 4
9 1
6 2
124 9
2 124 3
1 124
2 124 3
0 55 7
0 8 55
0 10 8
2 10 4
2 6 1
2 3 2
2 9 7
2 8 3
Примерен изход:
4
0
1
2
4
0
1