class Solution:
def sumSubarrayMins(self, arr: List[int]) -> int:
n, res = len(arr), 0
MOD = 1000000007
for i in range(n):
minVal = arr[i]
for j in range(i, n):
minVal = min(minVal, arr[j])
res = (res + minVal) % MOD
return resclass Solution:
def sumSubarrayMins(self, arr: List[int]) -> int:
MOD = 10**9 + 7
n = len(arr)
# Compute previous smaller
prev_smaller = [-1] * n
stack = []
for i in range(n):
while stack and arr[stack[-1]] > arr[i]:
stack.pop()
prev_smaller[i] = stack[-1] if stack else -1
stack.append(i)
# Compute next smaller
next_smaller = [n] * n
stack = []
for i in range(n - 1, -1, -1):
while stack and arr[stack[-1]] >= arr[i]:
stack.pop()
next_smaller[i] = stack[-1] if stack else n
stack.append(i)
res = 0
for i in range(n):
left = i - prev_smaller[i]
right = next_smaller[i] - i
res = (res + arr[i] * left * right) % MOD
return resclass Solution:
def sumSubarrayMins(self, arr: List[int]) -> int:
MOD = 10 ** 9 + 7
res = 0
arr = [float("-inf")] + arr + [float("-inf")]
stack = [] # (index, num)
for i, n in enumerate(arr):
while stack and n < stack[-1][1]:
j, m = stack.pop()
left = j - stack[-1][0] if stack else j + 1
right = i - j
res = (res + m * left * right) % MOD
stack.append((i, n))
return resclass Solution:
def sumSubarrayMins(self, arr: List[int]) -> int:
MOD = 10**9 + 7
stack = []
res, n = 0, len(arr)
for i in range(n + 1):
while stack and (i == n or arr[i] < arr[stack[-1]]):
j = stack.pop()
left = j - (stack[-1] if stack else -1)
right = i - j
res = (res + arr[j] * left * right) % MOD
stack.append(i)
return resclass Solution:
def sumSubarrayMins(self, arr: List[int]) -> int:
MOD = 10**9 + 7
n = len(arr)
dp = [0] * n
stack, res = [], 0
for i in range(n):
while stack and arr[stack[-1]] > arr[i]:
stack.pop()
j = stack[-1] if stack else -1
dp[i] = (dp[j] if j != -1 else 0) + arr[i] * (i - j)
dp[i] %= MOD
res = (res + dp[i]) % MOD
stack.append(i)
return res