





"""simple docstring"""





from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available


_lowerCamelCase       =	{'''configuration_nat''': ['''NAT_PRETRAINED_CONFIG_ARCHIVE_MAP''', '''NatConfig''']}


try:
    if not is_torch_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    _lowerCamelCase       =	[
        '''NAT_PRETRAINED_MODEL_ARCHIVE_LIST''',
        '''NatForImageClassification''',
        '''NatModel''',
        '''NatPreTrainedModel''',
        '''NatBackbone''',
    ]

if TYPE_CHECKING:
    from .configuration_nat import NAT_PRETRAINED_CONFIG_ARCHIVE_MAP, NatConfig

    try:
        if not is_torch_available():
            raise OptionalDependencyNotAvailable()
    except OptionalDependencyNotAvailable:
        pass
    else:
        from .modeling_nat import (
            NAT_PRETRAINED_MODEL_ARCHIVE_LIST,
            NatBackbone,
            NatForImageClassification,
            NatModel,
            NatPreTrainedModel,
        )

else:
    import sys

    _lowerCamelCase       =	_LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)




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()
