classSolution { public: longlongsubArrayRanges(vector<int>& nums){ longlong res = 0; int n = nums.size(); stack<int> maxVal, minVal; for (int i = 0; i <= n; i++) { while (!maxVal.empty() && (i == n || nums[maxVal.top()] < nums[i])) { int prevMaxIdx = maxVal.top(); maxVal.pop(); int left = maxVal.empty() ? -1 : maxVal.top(); res += (longlong)nums[prevMaxIdx] * (prevMaxIdx - left) * (i - prevMaxIdx); } maxVal.push(i); while (!minVal.empty() && (i == n || nums[minVal.top()] > nums[i])) { int prevMaxIdx = minVal.top(); minVal.pop(); int left = minVal.empty() ? -1 : minVal.top(); res -= (longlong)nums[prevMaxIdx] * (prevMaxIdx - left) * (i - prevMaxIdx); } minVal.push(i); } return res; } };