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
/***********
* Coded by *
*   ACS    *
***********/

// p: Problem F. Largest Rectangle
// j: VJUDGE
// c: Contest1 Div 1

#include <bits/stdc++.h>

#define cic(in,n) for(int i=in;i<n;i++)
#define rep(i,a,n) for(int i=a;i<n;i++)
#define All(a) a.begin(),a.end()
#define PB push_back
#define FIND(m,v) (m.find(v) != m.end())
#define print(n) cout<<n<<"\n"
#define CLR(m) memset(m, 0, sizeof(m))

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int MAX = 2e3 + 100, mod = 1e9 + 7, oo = INT_MAX;

int m, n, Mx[MAX][MAX], Upx[MAX][MAX];

int Lw[MAX], stk[MAX];
int BestRectangleByLine(int H[MAX])
{
    rep(i,0,n) Lw[i] = 1;  // Clean Memory
    for(int i = 0, pl = 0; i < n; stk[pl++] = i++)  // Find prev[i];
    {
        for(; pl > 0 && H[i] <= H[stk[pl-1]] ; pl--); // prev[i] = stk[pl]
        if(pl == 0) Lw[i] += i;
        else        Lw[i] += i - stk[pl-1] - 1;
    }
    for(int i = n-1, pl = 0; i >= 0; stk[pl++] = i--) // Find next[i];
    {
        for(; pl > 0 && H[i] <= H[stk[pl-1]] ; pl--);    // next[i] = stk[pl]
        if(pl == 0) Lw[i] += n - 1 - i;
        else        Lw[i] += stk[pl-1] - i - 1;
    }
    int solve = 0;
    rep(i,0,n) solve = max(solve, Lw[i]*H[i]);
    return solve;
}

int BestRectangle()
{
    rep(i,0,n) Upx[0][i] = ((Mx[0][i] == 0)?1:0);
    int solve = BestRectangleByLine(Upx[0]);
    rep(i,1,m)
    {
        rep(j,0,n)
            if(!Mx[i][j]) Upx[i][j] += Upx[i-1][j] + 1;
            else Upx[i][j] = 0;
        solve = max(solve, BestRectangleByLine(Upx[i]));
    }
    return solve;
}


int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> m >> n;
    rep(i,0,m) rep(j,0,n) cin >> Mx[i][j];
    print(BestRectangle());
    return 0;
}




