907. Sum of Subarray Minimums
``` java=
class Solution {
public int sumSubarrayMins(int[] arr) {
int n = arr.length;
Stack<Integer> sk = new Stack<>();
long left [] = new long [n];
for(int i = 0; i < n; i ++){
while(!sk.isEmpty() && arr[i] < arr[sk.peek()]){
sk.pop();
}
left[i] = sk.isEmpty() ? 0 : sk.peek() + 1;
sk.push(i);
}
sk.clear();
long right [] = new long [n];
for(int i = n - 1; i >= 0; i --){
while(!sk.isEmpty() && arr[i] <= arr[sk.peek()]){
sk.pop();
}
right[i] = sk.isEmpty() ? n - 1 : sk.peek() - 1;
sk.push(i);
}
long ans = 0;
for(int i = 0; i < n; i++){
ans = (ans + (long)(i - left[i] + 1)* (long)(right[i] - i + 1)*arr[i]) % 1000_000_007;
}
return (int)ans;
}
}
```