





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'''







   __A      					=   1
   while (1 << j) < max_node:
      for i in range(1				,       max_node + 1	):
         __A      					=   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]:
      __A					,						__A      					=   swap(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_	)
   # making depth of u same as depth of v
   for i in range(1_8				,       -1				,       -1	):
      if level[u] - (1 << i) >= level[v]:
         __A      					=   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(1_8				,       -1				,       -1	):
      if parent[i][u] not in [0, parent[i][v]]:
         __A					,						__A      					=   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'''







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


   '''simple docstring'''







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


if __name__ == "__main__":
    main()




from __future__ import annotations

from queue import Queue




def        lowerCAmelCase(	SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )->		tuple[int, int]:



    """simple docstring"""






    a ^= b
    b ^= a
    a ^= b
    return a, b




def        lowerCAmelCase(	SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )->		list[list[int]]:



    """simple docstring"""






    UpperCamelCase_          =		1
    while (1 << j) < max_node:
        for i in range(1       ,		max_node + 1       ):
            UpperCamelCase_          =		parent[j - 1][parent[j - 1][i]]
        j += 1
    return parent




def        lowerCAmelCase(	SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )->		int:



    """simple docstring"""






    if level[u] < level[v]:
        UpperCamelCase_   ,    UpperCamelCase_          =		swap(SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )
    # making depth of u same as depth of v
    for i in range(1_8       ,		-1       ,		-1       ):
        if level[u] - (1 << i) >= level[v]:
            UpperCamelCase_          =		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(1_8       ,		-1       ,		-1       ):
        if parent[i][u] not in [0, parent[i][v]]:
            UpperCamelCase_   ,    UpperCamelCase_          =		parent[i][u], parent[i][v]
    # returning longest common ancestor of u,v
    return parent[0][u]




def        lowerCAmelCase(	SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_ = 1       ,		)->		tuple[list[int], list[list[int]]]:



    """simple docstring"""






    UpperCamelCase_          =		0
    UpperCamelCase_          =		Queue(maxsize=SCREAMING_SNAKE_CASE_       )
    q.put(SCREAMING_SNAKE_CASE_       )
    while q.qsize() != 0:
        UpperCamelCase_          =		q.get()
        for v in graph[u]:
            if level[v] == -1:
                UpperCamelCase_          =		level[u] + 1
                q.put(SCREAMING_SNAKE_CASE_       )
                UpperCamelCase_          =		u
    return level, parent




def        lowerCAmelCase(	)->		None:



    """simple docstring"""






    UpperCamelCase_          =		1_3
    # initializing with 0
    UpperCamelCase_          =		[[0 for _ in range(max_node + 1_0       )] for _ in range(2_0       )]
    # initializing with -1 which means every node is unvisited
    UpperCamelCase_          =		[-1 for _ in range(max_node + 1_0       )]
    UpperCamelCase_          =		{
        1: [2, 3, 4],
        2: [5],
        3: [6, 7],
        4: [8],
        5: [9, 1_0],
        6: [1_1],
        7: [],
        8: [1_2, 1_3],
        9: [],
        1_0: [],
        1_1: [],
        1_2: [],
        1_3: [],
    }
    UpperCamelCase_   ,    UpperCamelCase_          =		breadth_first_search(SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       ,		1       )
    UpperCamelCase_          =		create_sparse(SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )
    print("LCA of node 1 and 3 is: "       ,		lowest_common_ancestor(1       ,		3       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )       )
    print("LCA of node 5 and 6 is: "       ,		lowest_common_ancestor(5       ,		6       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )       )
    print("LCA of node 7 and 11 is: "       ,		lowest_common_ancestor(7       ,		1_1       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )       )
    print("LCA of node 6 and 7 is: "       ,		lowest_common_ancestor(6       ,		7       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )       )
    print("LCA of node 4 and 12 is: "       ,		lowest_common_ancestor(4       ,		1_2       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )       )
    print("LCA of node 8 and 8 is: "       ,		lowest_common_ancestor(8       ,		8       ,		SCREAMING_SNAKE_CASE_       ,		SCREAMING_SNAKE_CASE_       )       )


if __name__ == "__main__":
 main()
