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
#include <iostream>
#include <stack>
using namespace std;
const int MAX=1400;
int buffer[MAX][MAX],T[MAX][MAX];
int getLargestRectangle(int w,int buf[]){
    stack<pair<int,int> >S;//first:pos,second:height
    pair<int,int>rect;
    buf[w]=0;
    int maxv=0;
    for(int i=0;i<=w;i++){
        rect.first=i;
        rect.second=buf[i];
        if(S.empty())S.push(rect);
        else if (rect.second>S.top().second)S.push(rect);
        else if(rect.second<S.top().second){
            while(!S.empty() && rect.second<S.top().second){
                int x=S.top().first;
                int h=S.top().second;
                S.pop();
                maxv=max(maxv,h*(i-x));
                rect.first=x;
            }
            S.push(rect);
        }
    }
    return maxv;
}
int getLargestRectangle(int h,int w){
    for(int i=0;i<h;i++)
        for(int j=0;j<w;j++)
            if(buffer[i][j]==1)T[i][j]=0;
            else
                T[i][j]=i>0?T[i-1][j]+1:1;
    int maxv=0;
    for(int i=0;i<h;i++)
        maxv=max(maxv,getLargestRectangle(w,T[i]));
    return maxv;
}
int main()
{
    int H,W;
    cin>>H>>W;
    for(int i=0;i<H;i++)
        for(int j=0;j<W;j++)
            cin>>buffer[i][j];
    cout<<getLargestRectangle(H,W)<<endl;
    return 0;
}
    
