public int solution(int[] heights) {
int n = heights.length;
if(n==0) return 0;
int[] left = new int[n];
int[] right = new int[n];
int res = 0;
Stack<Integer> s = new Stack<Integer>();
for(int i = 0 ;i<n;i++){
for(;!s.isEmpty()&&heights[i]<=heights[s.peek()];s.pop());
left[i] = s.isEmpty()?0:s.peek()+1;
s.push(i);
}
s.clear();
for(int i = n-1;i>=0;i--){
for(;!s.isEmpty()&&heights[i]<=heights[s.peek()];s.pop());
right[i] = s.isEmpty()?n-1:s.peek()-1;
s.push(i);
}
for(int i = 0;i<n;i++){
res = Math.max(res,(right[i]-left[i]+1)*heights[i]);
}
return res;
}