
    Given a list of route efficiency scores where each score represents the combined impact of traffic, weather, and delivery priority factors, find the continuous sequence of connected routes that yields the highest overall fleet performance when their scores are multiplied together. The efficiency scores can be positive or negative, where positive values indicate favorable delivery conditions and negative values represent challenging conditions that cause delays.
    

    
def max_subarray_product(arr):
    """
    Given a list of route efficiency scores where each score represents the combined impact of traffic, weather, and delivery priority factors, find the continuous sequence of connected routes that yields the highest overall fleet performance when their scores are multiplied together. The efficiency scores can be positive or negative, where positive values indicate favorable delivery conditions and negative values represent challenging conditions that cause delays.
    

    """
def max_subarray_product(arr):
    """
    Given a list of route efficiency scores where each score represents the combined impact of traffic, weather, and delivery priority factors, find the continuous sequence of connected routes that yields the highest overall fleet performance when their scores are multiplied together. The efficiency scores can be positive or negative, where positive values indicate favorable delivery conditions and negative values represent challenging conditions that cause delays.
    

    """
    n = len(arr)
    max_ending_here = 1
    min_ending_here = 1
    max_so_far = 0
    flag = 0
    for i in range(0, n):
        if arr[i] > 0:
            max_ending_here = max_ending_here * arr[i]
            min_ending_here = min(min_ending_here * arr[i], 1)
            flag = 1
        elif arr[i] == 0:
            max_ending_here = 1
            min_ending_here = 1
        else:
            temp = max_ending_here
            max_ending_here = max(min_ending_here * arr[i], 1)
            min_ending_here = temp * arr[i]
        if max_so_far < max_ending_here:
            max_so_far = max_ending_here
    if flag == 0 and max_so_far == 0:
        return 0
    return max_so_far