
    Given a sequence of student practice scores where positive values represent points gained from correct answers and negative values represent points lost from incorrect answers, identify the consecutive sequence of questions that resulted in the highest overall learning effectiveness score when multiplied together. This scoring method helps identify the most impactful streak of practice questions, whether positive or negative, to better understand student performance patterns.
    

    
def max_subarray_product(arr):
    """
    Given a sequence of student practice scores where positive values represent points gained from correct answers and negative values represent points lost from incorrect answers, identify the consecutive sequence of questions that resulted in the highest overall learning effectiveness score when multiplied together. This scoring method helps identify the most impactful streak of practice questions, whether positive or negative, to better understand student performance patterns.
    

    """
def max_subarray_product(arr):
    """
    Given a sequence of student practice scores where positive values represent points gained from correct answers and negative values represent points lost from incorrect answers, identify the consecutive sequence of questions that resulted in the highest overall learning effectiveness score when multiplied together. This scoring method helps identify the most impactful streak of practice questions, whether positive or negative, to better understand student performance patterns.
    

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