# 907. Sum of Subarray Minimums # 10 / 8 - Given an array of integers arr, find the sum of min(b), where b ranges over every (contiguous) subarray of arr. ``` Input: arr = [3,1,2,4] Output: 17 Explanation: Subarrays are [3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4], [3,1,2,4]. Minimums are 3, 1, 2, 4, 1, 1, 2, 1, 1, 1. Sum is 17. ``` 1. generate all possibilties of Subarrays are [3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4], [3,1,2,4]. 2. find each min(v) [-inf, 3, 1, -inf] -- monotonic stack [] [3,1] -> [3,1] ,[3], [1] n = 3 stack[3] n = 1 stack[(3, 0)] (1, 1) 0-0 -> min() -> 3 stack[(1, 1)] 0-1 -> min() -> 1 ```python= class Solution(object): def sumSubarrayMins(self, arr): # step 1 init arr = [-inf] + arr + [-inf] monoIdxStack = [] ans = 0 # [ 0, 1, 2, 3] idx # [-inf, 1, 1, -inf] val # step 2 process n for idx, num in eunmerate(arr): # idx = 2 num = 1 # monoIdxStack = [0, 1] while monoIdxStack and arr[monoIdxStack[-1]] > num: preIdx = monoIdxStack.pop() # 1 -> idx of 3 left = monoIdxStack[-1] right = idx l = (preIdx - left) # 1 - 0 r = (right - preIdx) # 2 - 1 # amortized # (2 - 0 - 1) * 3 for range [1-1] # right = 2 # left = 0 # sum of this num as a minimal val in range(left, right) s = l*r*arr[preIdx] ans += s monoIdxStack.append(idx) # step 3 ans return ans ```