
import heapq as hq
import math
from collections.abc import Iterator







class 			__A:




				def __init__(     self		,     _snake_case				)    ->      List[Any]:


								'''simple docstring'''




								__a										=    str(id_				)
								__a										=    None
								__a										=    None
								__a										=    []
								__a										=    {}  # {vertex:distance}




				def __lt__(     self		,     _snake_case				)    ->      List[Any]:


								'''simple docstring'''




								return self.key < other.key




				def __repr__(     self				)    ->      Optional[int]:


								'''simple docstring'''




								return self.id




				def 				SCREAMING_SNAKE_CASE_		(     self		,     _snake_case				)    ->      int:


								'''simple docstring'''




								self.neighbors.append(_snake_case				)




				def 				SCREAMING_SNAKE_CASE_		(     self		,     _snake_case		,     _snake_case				)    ->      Optional[Any]:


								'''simple docstring'''




								__a										=    weight



def     __lowerCAmelCase			(			a__						,    a__						,    a__						,    a__  )       ->  Tuple:
				# add the neighbors:
				graph[a - 1].add_neighbor(graph[b - 1]  )
				graph[b - 1].add_neighbor(graph[a - 1]  )
				# add the edges:
				graph[a - 1].add_edge(graph[b - 1]						,    a__  )
				graph[b - 1].add_edge(graph[a - 1]						,    a__  )


def     __lowerCAmelCase			(			a__						,    a__  )       ->  list:
				__a										=    []
				for u in graph:
								__a										=    math.inf
								__a										=    None
				__a										=    0
				__a										=    graph[:]
				while q:
								__a										=    min(a__  )
								q.remove(a__  )
								for v in u.neighbors:
												if (v in q) and (u.edges[v.id] < v.key):
																__a										=    u
																__a										=    u.edges[v.id]
				for i in range(1						,    len(a__  )  ):
								a.append((int(graph[i].id  ) + 1, int(graph[i].pi.id  ) + 1)  )
				return a


def     __lowerCAmelCase			(			a__						,    a__  )       ->  Iterator[tuple]:
				for u in graph:
								__a										=    math.inf
								__a										=    None
				__a										=    0

				__a										=    list(a__  )
				hq.heapify(a__  )

				while h:
								__a										=    hq.heappop(a__  )
								for v in u.neighbors:
												if (v in h) and (u.edges[v.id] < v.key):
																__a										=    u
																__a										=    u.edges[v.id]
																hq.heapify(a__  )

				for i in range(1						,    len(a__  )  ):
								yield (int(graph[i].id  ) + 1, int(graph[i].pi.id  ) + 1)


def     __lowerCAmelCase			(			)       ->  None:
				pass


if __name__ == "__main__":
					import doctest

					doctest.testmod()

from __future__ import annotations

import time
from collections.abc import Sequence
from random import randint

from matplotlib import pyplot as plt


def     __lowerCAmelCase			(			a__						,    a__						,    a__  )       ->  tuple[int | None, int | None, float]:
				if not arr:
								return None, None, 0
				if low == high:
								return low, high, arr[low]

				__a										=    (low + high) // 2
				__a							,     __a							,     __a										=    max_subarray(a__						,    a__						,    a__  )
				__a							,     __a							,     __a										=    max_subarray(a__						,    mid + 1						,    a__  )
				__a							,     __a							,     __a										=    max_cross_sum(a__						,    a__						,    a__						,    a__  )
				if left_sum >= right_sum and left_sum >= cross_sum:
								return left_low, left_high, left_sum
				elif right_sum >= left_sum and right_sum >= cross_sum:
								return right_low, right_high, right_sum
				return cross_left, cross_right, cross_sum


def     __lowerCAmelCase			(			a__						,    a__						,    a__						,    a__  )       ->  tuple[int, int, float]:
				__a							,     __a										=    float('''-inf'''  ), -1
				__a							,     __a										=    float('''-inf'''  ), -1

				__a										=    0
				for i in range(a__						,    low - 1						,    -1  ):
								summ += arr[i]
								if summ > left_sum:
												__a										=    summ
												__a										=    i

				__a										=    0
				for i in range(mid + 1						,    high + 1  ):
								summ += arr[i]
								if summ > right_sum:
												__a										=    summ
												__a										=    i

				return max_left, max_right, (left_sum + right_sum)


def     __lowerCAmelCase			(			a__  )       ->  float:
				__a										=    [randint(1						,    a__  ) for _ in range(a__  )]
				__a										=    time.time()
				max_subarray(a__						,    0						,    input_size - 1  )
				__a										=    time.time()
				return end - start


def     __lowerCAmelCase			(			)       ->  None:
				__a										=    [10, 100, 1000, 1_0000, 5_0000, 10_0000, 20_0000, 30_0000, 40_0000, 50_0000]
				__a										=    [time_max_subarray(a__  ) for input_size in input_sizes]
				print('''No of Inputs\t\tTime Taken'''  )
				for input_size, runtime in zip(a__						,    a__  ):
								print(a__						,    '''\t\t'''						,    a__  )
				plt.plot(a__						,    a__  )
				plt.xlabel('''Number of Inputs'''  )
				plt.ylabel('''Time taken in seconds'''  )
				plt.show()


if __name__ == "__main__":
					from doctest import testmod

					testmod()