class Solution {
public:
    /**
     * max water
     * @param arr int整型vector the array
     * @return long长整型
     */
    long long maxWater(vector<int>& arr) {
        // write code here
        stack<int> id; // 单调递减栈 stack
        int n = arr.size();
        long long res = 0;
        for (int i = 0; i < n; i ++ ) {
            while (!id.empty() && arr[id.top()] < arr[i])
            {
                int mid = id.top(); // 取出夹起来的区间中点
                id.pop();
                if (id.empty()) break;    // 如果夹不住就退出循环
                
                int l = id.top();    // 左端点
                int r = i;            // 右端点
                
                int h = min(arr[l], arr[r]) - arr[mid];    // 区间高度
                int w = r - l - 1;        // 区间长度
                res += (long long)w * h;    // 区间面积
                
            }
            id.push(i);
        }
        return res;
    }
};