class Solution:
    def getMaxLen(self, A: List[int]) -> int:
        """tc O(N) sc O(1)
        avoid 0 => 0 split A into subarray 
        record first neg pos
        main idea: for each non-zero number, check current accumutive neg cnt to decide if we need to reduce possible max subarray length by 1  
                    each time we see a 0, reset first negtive number position and update last zero position to reculate current valid range its max length  
        """
        first_neg,last_zero = -1,-1
        cur_len = max_len =0
        for i,a in enumerate(A):
            if a < 0:
                cur_len += 1
                if first_neg == -1:
                    first_neg = i
                    
            if a == 0:
                last_zero = i 
                first_neg = -1
                cur_len = 0
            else:
                # even number of negtive 
                if cur_len%2 == 0:
                    max_len = max(i - last_zero,max_len)
                else:
                    max_len = max(i-first_neg,max_len)
        return max_len