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 <cstdio>
#include <iostream>
#include <stack>
#include <algorithm>
#define MAX 1400
using namespace std;

struct Rectangle {
    int height;
    int pos;
};

int getLargestRectangle(int size,int buffer[]) {
    stack<Rectangle> S;
    int maxv=0;
    buffer[size]=0;

    for(int i=0;i<=size;i++) {
        Rectangle rect;
        rect.height=buffer[i];
        rect.pos=i;
        if(S.empty()||S.top().height<rect.height)
            S.push(rect);
        else if(S.top().height>rect.height) {
            int target=i;
            while(!S.empty()&&S.top().height>=rect.height) {
                Rectangle pre=S.top();S.pop();
                int area=pre.height*(i-pre.pos);
                maxv=max(maxv,area);
                target=pre.pos;
            }
            rect.pos=target;
            S.push(rect);
        }
    }
    return maxv;
}

int H,W;
int buffer[MAX][MAX];
int T[MAX][MAX];

int getLargestRectangle() {
    for(int j=0;j<W;j++)
        for(int i=0;i<H;i++)
            if(buffer[i][j])
                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()
{
    scanf("%d %d",&H,&W);

    for(int i=0;i<H;i++)
        for(int j=0;j<W;j++)
            scanf("%d",&buffer[i][j]);

    cout<<getLargestRectangle()<<endl;
}