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: Accepted)

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
class Solve{
    public Solve(){}
    StringBuilder sb;
    public static int Main(){
        new Solve().Run();
        return 0;
    }
    void Run(){
        sb = new StringBuilder();
        Calc();
        Console.Write(sb.ToString());
    }
    void Calc(){
        int N = int.Parse(Console.ReadLine());
        string[] str = Console.ReadLine().Split(' ');
        long max = 0;
        {
            int p = 0;
            long[] stack = new long[N+1];
            int[] point = new int[N+1];
            for(int i=0;i<N;i++){
                long h = long.Parse(str[i]);
                while(p > 0 && stack[p-1] > h){
                    int l = p == 1 ? 0 : point[p-2] + 1;
                    max = Math.Max(max,stack[p-1]*(i-l));
                    p--;
                }
                stack[p] = h;
                point[p] = i;
                p++;
            }
            while(p > 0 && stack[p-1] > 0){
                int l = p == 1 ? 0 : point[p-2] + 1;
                max = Math.Max(max,stack[p-1]*(N-l));
                p--;
            }
        }
        sb.Append(max+"\n");
    }
}