Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Largest Rectangle in a Histogram

A histogram is made of a number of contiguous bars, which have same width.

For a given histogram with $N$ bars which have a width of 1 and a height of $h_i$ = $h_1, h_2, ... , h_N$ respectively, find the area of the largest rectangular area.

Constraints

$1 \leq N \leq 10^5$

$0 \leq h_i \leq 10^9$

Input

The input is given in the following format.

$N$

$h_1$ $h_2$ ... $h_N$

Output

Print the area of the largest rectangle.

Sample Input 1

8
2 1 3 5 3 4 2 1

Sample Output 1

12

Sample Input 2

3
2 0 1

Sample Output 2

2

Solution in C++ (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define rep(i,n)   FOR(i,0,n)
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int,int> pint;

struct rect{int ht;int pos;};
int tb[100001];
int area_rect(int size,int buf[]){
    stack<rect> st;
    int mx=0;
    buf[size]=0;
    rep(i,size+1){
        rect r;
        r.ht=buf[i];
        r.pos=i;
        if(st.empty()) st.push(r);
        else{
            if(st.top().ht<r.ht) st.push(r);
            else if (st.top().ht>r.ht){
                int ti=i;
                while(!st.empty()&&st.top().ht>=r.ht){
                    rect pre=st.top();st.pop();
                    int area=pre.ht*(i-pre.pos);
                    mx=max(mx,area);
                    ti=pre.pos;
                }
                r.pos = ti;
                st.push(r);
            }
        }
    }
    return mx;
}
int main(){
    int n;
    cin>>n;
    rep(i,n) cin>>tb[i];
    int mx=area_rect(n,tb);
    cout<<mx<<endl;
    return 0;
}