
    Given a sequence of student performance scores from consecutive learning activities, find the most impactful learning streak that maximizes the combined effectiveness of connected learning experiences. The performance scores can be positive (indicating successful task completion) or negative (representing learning challenges), and your goal is to identify the continuous sequence of activities that produced the highest overall learning impact when their scores are multiplied together.
    

    
def max_subarray_product(arr):
    """
    Given a sequence of student performance scores from consecutive learning activities, find the most impactful learning streak that maximizes the combined effectiveness of connected learning experiences. The performance scores can be positive (indicating successful task completion) or negative (representing learning challenges), and your goal is to identify the continuous sequence of activities that produced the highest overall learning impact when their scores are multiplied together.
    

    """
def max_subarray_product(arr):
    """
    Given a sequence of student performance scores from consecutive learning activities, find the most impactful learning streak that maximizes the combined effectiveness of connected learning experiences. The performance scores can be positive (indicating successful task completion) or negative (representing learning challenges), and your goal is to identify the continuous sequence of activities that produced the highest overall learning impact when their scores are multiplied together.
    

    """
    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