Given a matrix (H × W) which contains only 1 and 0, find the area of the largest rectangle which only contains 0s.

Constraints

* 1 ≤ H, W ≤ 1,400

Input


H W
c1,1 c1,2 ... c1,W
c2,1 c2,2 ... c2,W
:
cH,1 cH,2 ... cH,W


In the first line, two integers H and W separated by a space character are given. In the following H lines, ci,j, elements of the H × W matrix, are given.

Output

Print the area (the number of 0s) of the largest rectangle.

Example

Input

4 5
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 0 0 1 0


Output

6
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DPL3_B
{
    class Program
    {
        struct Rec
        {
            public int h;
            public int p;
            public Rec(int h, int p)
            {
                this.h = h;
                this.p= p;
            }
        }
        static void Main(string[] args)
        {
            var a = scan;
            int H = a[0];
            int W = a[1];
            var dp = new int[H, W+1];
            int max = 0;
            for (int i = 0; i < H; i++)
            {
                var k = scan;
                for (int j = 0; j < W; j++)
                {
                    dp[i, j] = k[j] == 1 ? 0 : i == 0 ? 1 : dp[i - 1, j] + 1;
                }
            }
            for (int i = 0; i < H; i++)
            {
                var S = new Stack<Rec>();
                for (int j  = 0; j <= W; j++)
                {
                    var rec = new Rec();
                    rec.h = dp[i, j];
                    rec.p = j;
                    if (S.Any())
                    {
                        if (S.Peek().h < rec.h) S.Push(rec);
                        else if(S.Peek().h > rec.h)
                        {
                            int target = j;
                            while (S.Any() && S.Peek().h > rec.h)
                            {
                                Rec pre = S.Pop();
                                int area = pre.h * (j - pre.p);
                                max = Math.Max(max,area);
                                target = pre.p;
                            }
                            rec.p = target;
                            S.Push(rec);
                        }
                    }
                    else S.Push(rec);
                }
            }
            Console.WriteLine(max);
        }

        static int[] scan
        {
            get { return Console.ReadLine().Split().Select(int.Parse).ToArray(); }
        }
    }
}