


from __future__ import annotations

from queue import Queue
def        UpperCAmelCase_      (							__snake_case  ,		__snake_case		)  ->    tuple[int, int]:







 """simple docstring"""


 a ^= b
 b ^= a
 a ^= b
 return a, b
def        UpperCAmelCase_      (							__snake_case  ,		__snake_case		)  ->    list[list[int]]:







 """simple docstring"""


 _lowercase							   =1
 while (1 << j) < max_node:
  for i in range(1  ,		max_node + 1		):
   _lowercase							   =parent[j - 1][parent[j - 1][i]]
  j += 1
 return parent
def        UpperCAmelCase_      (							__snake_case  ,		__snake_case  ,		__snake_case  ,		__snake_case		)  ->    int:







 """simple docstring"""


 if level[u] < level[v]:
  _lowercase   ,					_lowercase							   =swap(__snake_case  ,		__snake_case		)
 # making depth of u same as depth of v
 for i in range(18  ,		-1  ,		-1		):
  if level[u] - (1 << i) >= level[v]:
   _lowercase							   =parent[i][u]
    # at the same depth if u==v that mean lca is found
 if u == v:
  return u
 # moving both nodes upwards till lca in found
 for i in range(18  ,		-1  ,		-1		):
  if parent[i][u] not in [0, parent[i][v]]:
   _lowercase   ,					_lowercase							   =parent[i][u], parent[i][v]
    # returning longest common ancestor of u,v
 return parent[0][u]
def        UpperCAmelCase_      (							__snake_case  ,		__snake_case  ,		__snake_case  ,		__snake_case  ,		__snake_case = 1  ,		)  ->    tuple[list[int], list[list[int]]]:







 """simple docstring"""


 _lowercase							   =0
 _lowercase							   =Queue(maxsize=__snake_case		)
 q.put(__snake_case		)
 while q.qsize() != 0:
  _lowercase							   =q.get()
  for v in graph[u]:
   if level[v] == -1:
    _lowercase							   =level[u] + 1
    q.put(__snake_case		)
    _lowercase							   =u
 return level, parent
def        UpperCAmelCase_      (							)  ->    None:







 """simple docstring"""


 _lowercase							   =13
 # initializing with 0
 _lowercase							   =[[0 for _ in range(max_node + 10		)] for _ in range(20		)]
 # initializing with -1 which means every node is unvisited
 _lowercase							   =[-1 for _ in range(max_node + 10		)]
 _lowercase							   ={
     1: [2, 3, 4],
     2: [5],
     3: [6, 7],
     4: [8],
     5: [9, 10],
     6: [11],
     7: [],
     8: [12, 13],
     9: [],
     10: [],
     11: [],
     12: [],
     13: [],
 }
 _lowercase   ,					_lowercase							   =breadth_first_search(__snake_case  ,		__snake_case  ,		__snake_case  ,		__snake_case  ,		1		)
 _lowercase							   =create_sparse(__snake_case  ,		__snake_case		)
 print('''LCA of node 1 and 3 is: '''  ,		lowest_common_ancestor(1  ,		3  ,		__snake_case  ,		__snake_case		)		)
 print('''LCA of node 5 and 6 is: '''  ,		lowest_common_ancestor(5  ,		6  ,		__snake_case  ,		__snake_case		)		)
 print('''LCA of node 7 and 11 is: '''  ,		lowest_common_ancestor(7  ,		11  ,		__snake_case  ,		__snake_case		)		)
 print('''LCA of node 6 and 7 is: '''  ,		lowest_common_ancestor(6  ,		7  ,		__snake_case  ,		__snake_case		)		)
 print('''LCA of node 4 and 12 is: '''  ,		lowest_common_ancestor(4  ,		12  ,		__snake_case  ,		__snake_case		)		)
 print('''LCA of node 8 and 8 is: '''  ,		lowest_common_ancestor(8  ,		8  ,		__snake_case  ,		__snake_case		)		)


if __name__ == "__main__":
  main()





from ..utils import DummyObject, requires_backends







class    lowerCamelCase__     ( metaclass=lowerCAmelCase):
     SCREAMING_SNAKE_CASE__       =    ['''tensorflow_text''']





     def __init__(self	,  *UpperCAmelCase	,  **UpperCAmelCase )  ->     Any:
      requires_backends(self	,  ['''tensorflow_text'''] )

