![]()
class node:
def __init__(self,depth = 0,father = -1,
index = -1,mark = -2):
self.depth = depth
self.father = father
self.
index =
index
self.mark = mark
path = []
nodes = []
MAXN = 100000+5
def NEW(x,y):
path.append([y,x])
l = len(
path)-1
nodes[y] = node(0,-1,l,-1)
nodes[x] = node(0,y,l,1)
def CON(x,y):
if ( nodes[y].mark == 1 ):
nodes[x] = node(nodes[y].depth+1,nodes[y].father,nodes[y].
index,1)
nodes[y].mark = 0
path[nodes[y].
index].append(x)
elif(( nodes[y].mark == -1 ) & ( len(
path[nodes[y].
index]) == 1 ) ):
nodes[x] = node(nodes[y].depth+1,nodes[y].father,nodes[y].
index,1)
path[nodes[y].
index].append(x)
else:
ADD(x)
l = len(
path)-1
nodes[x] = node(0,y,l,1)
def ADD(x):
path.append([x])
def update(x,y):
if ( ( nodes[x].mark == -2 ) & ( nodes[y].mark == -2 ) ):
NEW(x,y)
elif ( ( nodes[x].mark == -2 ) & ( nodes[y].mark != -2 ) ):
CON(x,y)
elif ( ( nodes[x].mark != -2 ) & ( nodes[y].mark != -2 ) ):
nodes[x].father = y
elif ( ( nodes[x].mark != -2 ) & ( nodes[y].mark == -2 ) ):
ADD(y)
nodes[y] = node(0,-1,len(
path)-1,1)
nodes[x].father = y
def DEL(x):
path[nodes[x].
index].remove(x)
nodes[x] = node()
def LOA(x,k):
if ( x == 0 ):
return 0;
if ( nodes[x].mark == -2 ):
return 0
if (nodes[x].depth >= k):
lt = nodes[x].depth - k
if (
path[nodes[x].
index][0] == 0 ):
lt = lt+1
return path[nodes[x].
index][lt]
if ( nodes[x].depth < k ):
if ( ( nodes[x].father == -1 ) or ( nodes[x].father == 0 ) ):
return 0
t = LOA(nodes[x].father,k-nodes[x].depth-1)
return t
def INIT():
global
path
global nodes
path = []
nodes = [node() for i in range(0,MAXN)]
def build():
n = int(input())
for i in range(0,n):
x,y = input().
split(' ')
x = int(x)
y = int(y)
update(x,y)
#
print(
path)
def Q():
n = int(input())
for i in range(0,n):
lt = input().
split(' ')
if ( lt[0] == '0' ):
update(int(lt[2]),int(lt[1]))
#
print(
path)
if ( lt[0] == '1' ):
DEL(int(lt[1]))
if ( lt[0] == '2' ):
print(LOA(int(lt[1]),int(lt[2])))
t = input()
t = int(t)
for i in range(0,t):
INIT()
build()
Q()