Question: 
Write a function to find the maximum product subarray of the given array.


Model's Code:
def max_subarray_product(arr):
    if not arr:
        return 0
    
    max_product = arr[0]
    min_product = arr[0]
    result = arr[0]
    
    for num in arr[1:]:
        if num < 0:
            max_product, min_product = min_product, max_product
            
        max_product = max(num, max_product * num)
        min_product = min(num, min_product * num)
        
        result = max(result, max_product)
    
    return result



Sample Correct Code:
def max_subarray_product(arr):
	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


Asserts:
assert max_subarray_product([1, -2, -3, 0, 7, -8, -2]) == 112
assert max_subarray_product([6, -3, -10, 0, 2]) == 180 
assert max_subarray_product([-2, -40, 0, -2, -3]) == 80


Tests:
Test 1 of 3: PASS
Test 2 of 3: PASS
Test 3 of 3: PASS

Test 463 of 974: 338/463 (73.00215982721382%): success