Find left and right smaller boundaries. Sum contributions.
function sumSubarrayMins(arr): n = len(arr) left = [-1] * n right = [n] * n stack = [] for i in range(n): while stack and arr[stack[-1]] >= arr[i]: stack.pop() left[i] = stack[-1] if stack else -1 stack.push(i) stack = [] for i in range(n - 1, -1, -1): while stack and arr[stack[-1]] > arr[i]: stack.pop() right[i] = stack[-1] if stack else n stack.push(i) MOD = 10**9 + 7 result = 0 for i in range(n): result = (result + arr[i] * (i - left[i]) * (right[i] - i)) % MOD return result
time, space.