The original idea is based on that how much water can be trapped by one element is decided by:

Min ( Max(bars_at_left), Max(bars_at_right) ) - height(current_bar).

But if we know, saying one bar at right (no necessarily be the longest bar at right side) is larger than Max(bars_at_left), there is no need to know what the Max(bars_at_right) is. And it works the same when some bar at left side larger than Max(bars_at_right).

Here is my code:

```
class Solution(object):
def trap(self, height):
#space cost o(1)
left_max = 0
right_max = 0
lo,hi = 0,len(height) - 1
water = 0
while(hi >= lo):
if(left_max <= right_max):
if (height[lo] < left_max):
water += left_max - height[lo]
else:
left_max = height[lo]
lo += 1
else:
if (height[hi] < right_max):
water += right_max - height[hi]
else:
right_max = height[hi]
hi -= 1
return water
```