import java.util.LinkedList;
class Solution {
public int sumSubarrayMins(int[] arr) {
int n = arr.length;
int[] dp = new int[n];
dp[0] = arr[0];
LinkedList<Integer> stack = new LinkedList<>();
stack.addLast(0);
int ans = dp[0];
for (int i = 1; i < n; i++) {
while (!stack.isEmpty() && arr[stack.getLast()] >= arr[i]) {
stack.pollLast();
}
int k = stack.isEmpty()?(i+1):(i - stack.getLast());
dp[i] = (k == (i+1))?k*arr[i]:(dp[i-k]+k*arr[i]);
ans += dp[i];
stack.addLast(i);
ans = ans % (1000000007);
}
return ans;
}
}