2
public int maxSumMinProduct(int[] nums) {3
int mod = (int) Math.pow(10, 9) + 7;6
// next smaller on left7
int[] left = new int[n];8
Stack<Integer> st = new Stack<>();11
for (int i = 1; i < n; i++) {12
while (st.size() > 0 && nums[st.peek()] >= nums[i]) {16
if (st.size() == 0) left[i] = -1;17
else left[i] = st.peek();22
// next smaller on right23
int[] right = new int[n];27
for (int i = n - 2; i >= 0; i--) {28
while (st.size() > 0 && nums[st.peek()] >= nums[i]) st.pop();30
if (st.size() > 0) right[i] = st.peek();36
long[] prefixSum = new long[n];37
prefixSum[0] = nums[0];38
for (int i = 1; i < n; i++) prefixSum[i] = prefixSum[i - 1] + nums[i];41
for (int i = 0; i < nums.length; i++) {45
max = Math.max(max, (prefixSum[r] - (l == -1 ? 0 : prefixSum[l])) * nums[i]);47
return (int) (max % mod);