classSolution{public:intsumSubarrayMins(vector<int>&arr){constexprintkMod=1'000'000'007;constintn=arr.size();longans=0;// prev[i] := index k s.t. arr[k] is the prev min in arr[:i]vector<int>prev(n,-1);// next[i] := index k s.t. arr[k] is the next min in arr[i + 1:]vector<int>next(n,n);stack<int>stack;for(inti=0;i<n;++i){while(!stack.empty()&&arr[stack.top()]>arr[i]){constintindex=stack.top();stack.pop();next[index]=i;}if(!stack.empty())prev[i]=stack.top();stack.push(i);}for(inti=0;i<n;++i){ans+=static_cast<long>(arr[i])*(i-prev[i])*(next[i]-i);ans%=kMod;}returnans;}};
classSolution{publicintsumSubarrayMins(int[]arr){finalintkMod=1_000_000_007;finalintn=arr.length;longans=0;// prev[i] := index k s.t. arr[k] is the prev min in arr[:i]int[]prev=newint[n];// next[i] := index k s.t. arr[k] is the next min in arr[i + 1:]int[]next=newint[n];Deque<Integer>stack=newArrayDeque<>();Arrays.fill(prev,-1);Arrays.fill(next,n);for(inti=0;i<arr.length;++i){while(!stack.isEmpty()&&arr[stack.peek()]>arr[i]){finalintindex=stack.pop();next[index]=i;}if(!stack.isEmpty())prev[i]=stack.peek();stack.push(i);}for(inti=0;i<arr.length;++i){ans+=(long)arr[i]*(i-prev[i])*(next[i]-i);ans%=kMod;}return(int)ans;}}
classSolution:defsumSubarrayMins(self,arr:List[int])->int:kMod=1_000_000_007n=len(arr)ans=0# prev[i] := index k s.t. arr[k] is the prev min in arr[:i]prev=[-1]*n# next[i] := index k s.t. arr[k] is the next min in arr[i + 1:]next=[n]*nstack=[]fori,ainenumerate(arr):whilestackandarr[stack[-1]]>a:index=stack.pop()next[index]=iifstack:prev[i]=stack[-1]stack.append(i)fori,ainenumerate(arr):ans+=a*(i-prev[i])*(next[i]-i)ans%=kModreturnans