int trap(int A[], int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(n <= 2)
            return 0;
        
        vector<int> leftMax(n, 0);
        vector<int> rightMax(n, 0);
        
        leftMax[0] = A[0];
        rightMax[n-1] = A[n-1];

        for(int i = 1; i < n-1; i++)
        {
            leftMax[i] = max(leftMax[i-1], A[i]);
            rightMax[n-1-i] = max(rightMax[n-1-i+1], A[n-1-i]);
        }
        
        int ret = 0;
        for(int i = 1; i< n-1; i++)
        {
            ret += (leftMax[i] > rightMax[i]?rightMax[i]:leftMax[i])-A[i];
        }
        return ret;
    }
			int trap(vector<int>& height)
			{
				int len = height.size();
				if (len == 0) { return 0; }

				vector<int> leftMax(len, 0);
				vector<int> rightMax(len, 0);
				int maxL = 0;
				int maxR = 0;
				for (int i = 0; i < len; i++)
				{
					leftMax[i] = maxL;
					maxL = max(maxL, height[i]);

					rightMax[len - 1 - i] = maxR;
					maxR = max(maxR, height[len - 1 - i]);
				}

				int result = 0;
				for (int i = 0; i < len; i++)
				{
					result += max(min(leftMax[i], rightMax[i]) - height[i], 0);
				}
				return result;
			}