/*
申明两个边界指针,容量由高度差决定,且边界的低高度决定容器大致容量,由两边向中间扫描,且低高度边界指针优先。
边界指针肯定越高越好,内部高度越低越好。
每次从左右边界最大值较小的一方开始向中间移动。左右指针只有按最小值移动,每次确定累加容量。
拥有较小的边界最值指针移动,如果移动后的高度下于边界值最大值,则容量累加。
重复过程,直到左右指针相遇。
*/
class Solution {
public:
    long long maxWater(vector<int>& arr) {
        long long ans = 0;
        int l_max = 0, r_max = 0;
        int l = 0, r = arr.size()-1;
        while(l <= r){
            l_max = max(l_max, arr[l]); // 左边最高点
            r_max = max(r_max, arr[r]); // 右边最高点
            if(l_max < r_max){ // 每次移动边界最值较小的指针。
                ans += l_max - arr[l++]; 
            }else{
                ans += r_max - arr[r--];
            }
        }
        return ans;
    }
};