#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * max water
     * @param arr int整型vector the array
     * @return long长整型
     */
    long long maxWater(vector<int>& arr) {
        // write code here
        // 双指针
        int n=arr.size();
        // 从左又向右投影,找出每条柱子在 已遍历的柱子中的最大值;
        vector<int> left_right(n,0);
        // 从右又向左投影,找出每条柱子在 已遍历的柱子中的最大值;
        vector<int> right_left(n,0);
        // 然后再次遍历数组arr,每条柱子从left_right和right_left中选出较小的值,减去当前柱子的长度,即为该柱子能存储的雨水量;
        // 其实就是找出当前柱子左右两边围起来区域的较矮的墙;

        for(int left=0; left<n; ++left)
        {
            if(left==0)
                left_right[left] = arr[left];
            else
                left_right[left] = max(left_right[left-1], arr[left]);
        }

        for(int right=n-1; right>=0; --right)
        {
            if(right==n-1)
                right_left[right] = arr[right];
            else
                right_left[right] = max(right_left[right+1], arr[right]);
        }

        int ans = 0;
        // 其实可以集成在第二次遍历中就来计算;
        // 算了,还是这样思路清晰点
        for(int i=0; i<n; ++i)
            ans += (min(left_right[i],right_left[i]) - arr[i]);
        
        return ans;
    }
};