class Solution { public: int maxSumMinProduct(vector<int>& nums) { int n = nums.size(); vector<int> left(n, -1); vector<int> right(n, n); stack<int> stk; for (int i = 0; i < n; ++i) { while (!stk.empty() && nums[stk.top()] >= nums[i]) { stk.pop(); } if (!stk.empty()) { left[i] = stk.top(); } stk.push(i); } stk = stack<int>(); for (int i = n - 1; ~i; --i) { while (!stk.empty() && nums[stk.top()] > nums[i]) { stk.pop(); } if (!stk.empty()) { right[i] = stk.top(); } stk.push(i); } long long s[n + 1]; s[0] = 0; for (int i = 0; i < n; ++i) { s[i + 1] = s[i] + nums[i]; } long long ans = 0; for (int i = 0; i < n; ++i) { ans = max(ans, nums[i] * (s[right[i]] - s[left[i] + 1])); } const int mod = 1e9 + 7; return ans % mod; } };