

'''simple docstring'''




from itertools import product




def 						UpperCamelCase	(			a		,						a			)				->     list[int]:






     '''simple docstring'''
     __magic_name__						       =    sides_number
     __magic_name__						       =    max_face_number * dice_number
     __magic_name__						       =    [0] * (max_total + 1)

     __magic_name__						       =    1
     __magic_name__						       =    range(a		,						max_face_number + 1			)
     for dice_numbers in product(a		,						repeat=a			):
          __magic_name__						       =    sum(a			)
          totals_frequencies[total] += 1

     return totals_frequencies




def 						UpperCamelCase	(			)				->     float:






     '''simple docstring'''
     __magic_name__						       =    total_frequency_distribution(
         sides_number=4		,						dice_number=9			)
     __magic_name__						       =    total_frequency_distribution(
         sides_number=6		,						dice_number=6			)

     __magic_name__						       =    0
     __magic_name__						       =    9
     __magic_name__						       =    4 * 9
     __magic_name__						       =    6
     for peter_total in range(a		,						max_peter_total + 1			):
          peter_wins_count += peter_totals_frequencies[peter_total] * sum(
              colin_totals_frequencies[min_colin_total:peter_total]			)

     __magic_name__						       =    (4**9) * (6**6)
     __magic_name__						       =    peter_wins_count / total_games_number

     __magic_name__						       =    round(a		,						ndigits=7			)

     return rounded_peter_win_probability


if __name__ == "__main__":
      print(F'''{solution() = }''')









'''simple docstring'''




from __future__ import annotations

import math
import random
from typing import Any






class   _SCREAMING_SNAKE_CASE   :



 def __init__(   self		:   Union[str, Any]      ):
      __magic_name__						       =    []
      __magic_name__						       =    0
      __magic_name__						       =    0



 def 			snake_case__  (   self		:   int      ):
      return self.head == self.tail



 def 			snake_case__  (   self		:   int			,				a__		:   Any      ):
      self.data.append(a__      )
      __magic_name__						       =    self.tail + 1



 def 			snake_case__  (   self		:   Tuple      ):
      __magic_name__						       =    self.data[self.head]
      __magic_name__						       =    self.head + 1
      return ret



 def 			snake_case__  (   self		:   Optional[Any]      ):
      return self.tail - self.head



 def 			snake_case__  (   self		:   List[Any]      ):
      print(self.data      )
      print('''**************'''      )
      print(self.data[self.head : self.tail]      )






class   _SCREAMING_SNAKE_CASE   :



 def __init__(   self		:   List[str]			,				a__		:   Any      ):
      __magic_name__						       =    data
      __magic_name__						       =    None
      __magic_name__						       =    None
      __magic_name__						       =    1



 def 			snake_case__  (   self		:   Optional[int]      ):
      return self.data



 def 			snake_case__  (   self		:   List[Any]      ):
      return self.left



 def 			snake_case__  (   self		:   Tuple      ):
      return self.right



 def 			snake_case__  (   self		:   Any      ):
      return self.height



 def 			snake_case__  (   self		:   Optional[Any]			,				a__		:   Any      ):
      __magic_name__						       =    data



 def 			snake_case__  (   self		:   int			,				a__		:   MyNode | None      ):
      __magic_name__						       =    node



 def 			snake_case__  (   self		:   Tuple			,				a__		:   MyNode | None      ):
      __magic_name__						       =    node



 def 			snake_case__  (   self		:   List[str]			,				a__		:   int      ):
      __magic_name__						       =    height




def 						UpperCamelCase	(			a			)				->     int:






     '''simple docstring'''
     if node is None:
          return 0
     return node.get_height()




def 						UpperCamelCase	(			a		,						a			)				->     int:






     '''simple docstring'''
     if a > b:
          return a
     return b




def 						UpperCamelCase	(			a			)				->     MyNode:






     '''simple docstring'''
     print('''left rotation node:'''		,						node.get_data()			)
     __magic_name__						       =    node.get_left()
     assert ret is not None
     node.set_left(ret.get_right()			)
     ret.set_right(a			)
     __magic_name__						       =    my_max(get_height(node.get_right()			)		,						get_height(node.get_left()			)			) + 1
     node.set_height(a			)
     __magic_name__						       =    my_max(get_height(ret.get_right()			)		,						get_height(ret.get_left()			)			) + 1
     ret.set_height(a			)
     return ret




def 						UpperCamelCase	(			a			)				->     MyNode:






     '''simple docstring'''
     print('''right rotation node:'''		,						node.get_data()			)
     __magic_name__						       =    node.get_right()
     assert ret is not None
     node.set_right(ret.get_left()			)
     ret.set_left(a			)
     __magic_name__						       =    my_max(get_height(node.get_right()			)		,						get_height(node.get_left()			)			) + 1
     node.set_height(a			)
     __magic_name__						       =    my_max(get_height(ret.get_right()			)		,						get_height(ret.get_left()			)			) + 1
     ret.set_height(a			)
     return ret




def 						UpperCamelCase	(			a			)				->     MyNode:






     '''simple docstring'''
     __magic_name__						       =    node.get_left()
     assert left_child is not None
     node.set_left(left_rotation(a			)			)
     return right_rotation(a			)




def 						UpperCamelCase	(			a			)				->     MyNode:






     '''simple docstring'''
     __magic_name__						       =    node.get_right()
     assert right_child is not None
     node.set_right(right_rotation(a			)			)
     return left_rotation(a			)




def 						UpperCamelCase	(			a		,						a			)				->     MyNode | None:






     '''simple docstring'''
     if node is None:
          return MyNode(a			)
     if data < node.get_data():
          node.set_left(insert_node(node.get_left()		,						a			)			)
          if (
              get_height(node.get_left()			) - get_height(node.get_right()			) == 2
          ):  # an unbalance detected
               __magic_name__						       =    node.get_left()
               assert left_child is not None
               if (
                   data < left_child.get_data()
               ):  # new node is the left child of the left child
                    __magic_name__						       =    right_rotation(a			)
               else:
                    __magic_name__						       =    lr_rotation(a			)
     else:
          node.set_right(insert_node(node.get_right()		,						a			)			)
          if get_height(node.get_right()			) - get_height(node.get_left()			) == 2:
               __magic_name__						       =    node.get_right()
               assert right_child is not None
               if data < right_child.get_data():
                    __magic_name__						       =    rl_rotation(a			)
               else:
                    __magic_name__						       =    left_rotation(a			)
     __magic_name__						       =    my_max(get_height(node.get_right()			)		,						get_height(node.get_left()			)			) + 1
     node.set_height(a			)
     return node




def 						UpperCamelCase	(			a			)				->     Any:






     '''simple docstring'''
     while True:
          __magic_name__						       =    root.get_right()
          if right_child is None:
               break
          __magic_name__						       =    right_child
     return root.get_data()




def 						UpperCamelCase	(			a			)				->     Any:






     '''simple docstring'''
     while True:
          __magic_name__						       =    root.get_left()
          if left_child is None:
               break
          __magic_name__						       =    left_child
     return root.get_data()




def 						UpperCamelCase	(			a		,						a			)				->     MyNode | None:






     '''simple docstring'''
     __magic_name__						       =    root.get_left()
     __magic_name__						       =    root.get_right()
     if root.get_data() == data:
          if left_child is not None and right_child is not None:
               __magic_name__						       =    get_left_most(a			)
               root.set_data(a			)
               root.set_right(del_node(a		,						a			)			)
          elif left_child is not None:
               __magic_name__						       =    left_child
          elif right_child is not None:
               __magic_name__						       =    right_child
          else:
               return None
     elif root.get_data() > data:
          if left_child is None:
               print('''No such data'''			)
               return root
          else:
               root.set_left(del_node(a		,						a			)			)
     else:  # root.get_data() < data
          if right_child is None:
               return root
          else:
               root.set_right(del_node(a		,						a			)			)

     if get_height(a			) - get_height(a			) == 2:
          assert right_child is not None
          if get_height(right_child.get_right()			) > get_height(right_child.get_left()			):
               __magic_name__						       =    left_rotation(a			)
          else:
               __magic_name__						       =    rl_rotation(a			)
     elif get_height(a			) - get_height(a			) == -2:
          assert left_child is not None
          if get_height(left_child.get_left()			) > get_height(left_child.get_right()			):
               __magic_name__						       =    right_rotation(a			)
          else:
               __magic_name__						       =    lr_rotation(a			)
     __magic_name__						       =    my_max(get_height(root.get_right()			)		,						get_height(root.get_left()			)			) + 1
     root.set_height(a			)
     return root






class   _SCREAMING_SNAKE_CASE   :



 def __init__(   self		:   List[Any]      ):
      __magic_name__						       =    None



 def 			snake_case__  (   self		:   List[Any]      ):
      return get_height(self.root      )



 def 			snake_case__  (   self		:   Optional[int]			,				a__		:   Any      ):
      print('''insert:''' + str(a__      )      )
      __magic_name__						       =    insert_node(self.root			,				a__      )



 def 			snake_case__  (   self		:   Dict			,				a__		:   Any      ):
      print('''delete:''' + str(a__      )      )
      if self.root is None:
           print('''Tree is empty!'''      )
           return
      __magic_name__						       =    del_node(self.root			,				a__      )



 def __str__(   self		:   Optional[Any]			,				):  # a level traversale, gives a more intuitive look on the tree
      __magic_name__						       =    ''''''
      __magic_name__						       =    MyQueue()
      q.push(self.root      )
      __magic_name__						       =    self.get_height()
      if layer == 0:
           return output
      __magic_name__						       =    0
      while not q.is_empty():
           __magic_name__						       =    q.pop()
           __magic_name__						       =    ''' ''' * int(math.pow(2			,				layer - 1      )      )
           output += space
           if node is None:
                output += "*"
                q.push(a__      )
                q.push(a__      )
           else:
                output += str(node.get_data()      )
                q.push(node.get_left()      )
                q.push(node.get_right()      )
           output += space
           __magic_name__						       =    cnt + 1
           for i in range(100      ):
                if cnt == math.pow(2			,				a__      ) - 1:
                     __magic_name__						       =    layer - 1
                     if layer == 0:
                          output += "\n*************************************"
                          return output
                     output += "\n"
                     break
      output += "\n*************************************"
      return output




def 						UpperCamelCase	(			)				->     None:






     '''simple docstring'''
     import doctest

     doctest.testmod()


if __name__ == "__main__":
      _test()
      _lowerCAmelCase         =						AVLtree()
      _lowerCAmelCase         =						list(range(10))
      random.shuffle(lst)
      for i in lst:
            t.insert(i)
            print(str(t))
      random.shuffle(lst)
      for i in lst:
            t.del_node(i)
            print(str(t))






