

from __future__ import annotations

from queue import Queue


def 							__lowercase     (	UpperCAmelCase__		,       UpperCAmelCase__   ):

					"""simple docstring"""






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


def 							__lowercase     (	UpperCAmelCase__		,       UpperCAmelCase__   ):

					"""simple docstring"""






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


def 							__lowercase     (	UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__   ):

					"""simple docstring"""






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


def 							__lowercase     (	UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__ = 1		,       ):

					"""simple docstring"""






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


def 							__lowercase     (	):

					"""simple docstring"""






					__lowerCAmelCase       =				13
					# initializing with 0
					__lowerCAmelCase       =				[[0 for _ in range(max_node + 10   )] for _ in range(20   )]
					# initializing with -1 which means every node is unvisited
					__lowerCAmelCase       =				[-1 for _ in range(max_node + 10   )]
					__lowerCAmelCase       =				{
					    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: [],
					}
					__lowerCAmelCase,						__lowerCAmelCase       =				breadth_first_search(UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       1   )
					__lowerCAmelCase       =				create_sparse(UpperCAmelCase__		,       UpperCAmelCase__   )
					print('LCA of node 1 and 3 is: '		,       lowest_common_ancestor(1		,       3		,       UpperCAmelCase__		,       UpperCAmelCase__   )   )
					print('LCA of node 5 and 6 is: '		,       lowest_common_ancestor(5		,       6		,       UpperCAmelCase__		,       UpperCAmelCase__   )   )
					print('LCA of node 7 and 11 is: '		,       lowest_common_ancestor(7		,       11		,       UpperCAmelCase__		,       UpperCAmelCase__   )   )
					print('LCA of node 6 and 7 is: '		,       lowest_common_ancestor(6		,       7		,       UpperCAmelCase__		,       UpperCAmelCase__   )   )
					print('LCA of node 4 and 12 is: '		,       lowest_common_ancestor(4		,       12		,       UpperCAmelCase__		,       UpperCAmelCase__   )   )
					print('LCA of node 8 and 8 is: '		,       lowest_common_ancestor(8		,       8		,       UpperCAmelCase__		,       UpperCAmelCase__   )   )


if __name__ == "__main__":
		main()









import os

from apache_beam.io.filesystems import FileSystems
from apache_beam.pipeline import Pipeline

from .logging import get_logger


lowerCamelCase   					=  2 << 2_0  # 2mb
lowerCamelCase   					=  get_logger(__name__)





class      snake_case_      (					_a				):


							"""simple docstring"""





							def 							A__	(			self				):
												__lowerCAmelCase       =				self._options.get_all_options().get('runner'				)
												return runner in [None, "DirectRunner", "PortableRunner"]


def 							__lowercase     (	UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__=False   ):

					"""simple docstring"""






					__lowerCAmelCase       =				FileSystems
					if fs.exists(UpperCAmelCase__   ):
										if force_upload:
															logger.info(F"""Remote path already exist: {remote_file_path}. Overwriting it as force_upload=True."""   )
										else:
															logger.info(F"""Remote path already exist: {remote_file_path}. Skipping it as force_upload=False."""   )
															return
					with fs.create(UpperCAmelCase__   ) as remote_file:
										with open(UpperCAmelCase__		,       'rb'   ) as local_file:
															__lowerCAmelCase       =				local_file.read(UpperCAmelCase__   )
															while chunk:
																				remote_file.write(UpperCAmelCase__   )
																				__lowerCAmelCase       =				local_file.read(UpperCAmelCase__   )


def 							__lowercase     (	UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__=False   ):

					"""simple docstring"""






					__lowerCAmelCase       =				FileSystems
					if os.path.exists(UpperCAmelCase__   ):
										if force_download:
															logger.info(F"""Local path already exist: {remote_file_path}. Overwriting it as force_upload=True."""   )
										else:
															logger.info(F"""Local path already exist: {remote_file_path}. Skipping it as force_upload=False."""   )
															return
					with fs.open(UpperCAmelCase__   ) as remote_file:
										with open(UpperCAmelCase__		,       'wb'   ) as local_file:
															__lowerCAmelCase       =				remote_file.read(UpperCAmelCase__   )
															while chunk:
																				local_file.write(UpperCAmelCase__   )
																				__lowerCAmelCase       =				remote_file.read(UpperCAmelCase__   )






