'''
You are given an integer array nums. The absolute sum of a subarray [numsl, numsl+1, ..., numsr-1, numsr] is abs(numsl + numsl+1 + ... + numsr-1 + numsr).

Return the maximum absolute sum of any (possibly empty) subarray of nums.

Note that abs(x) is defined as follows:

If x is a negative integer, then abs(x) = -x.
If x is a non-negative integer, then abs(x) = x.
 

Example 1:

Input: nums = [1,-3,2,3,-4]
Output: 5
Explanation: The subarray [2,3] has absolute sum = abs(2+3) = abs(5) = 5.
Example 2:

Input: nums = [2,-5,1,-4,3,-2]
Output: 8
Explanation: The subarray [-5,1,-4] has absolute sum = abs(-5+1-4) = abs(-8) = 8.
 

Constraints:

1 <= nums.length <= 105
-104 <= nums[i] <= 104
'''
import unittest

from typing import *

class Solution:
    def maxAbsoluteSum(self, nums: List[int]) -> int:
        pre_sum = 0
        min_v = 0
        max_v = 0
        for i in range(len(nums)):
            pre_sum += nums[i]
            min_v = min(min_v, pre_sum)
            max_v = max(max_v, pre_sum)
            
        return abs(max_v - min_v)

class TestSolution(unittest.TestCase):

    def test_case(self):
        examples = (
            (([2,-5,1,-4,3,-2],),8),
        )
        for first, second in examples:
            self.assert_function(first, second)

    def assert_function(self, first, second):
        self.assertEqual(Solution().maxAbsoluteSum(*first), second,
                         msg="first: {}; second: {}".format(first, second))


unittest.main()
