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 <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Rectangle{
    int height;
    int pos;
};

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

    for(int i=0; i<=size; i++){
        Rectangle rect;
        rect.height=Hist[i];
        rect.pos=i;

        if(S.empty()){
            S.push(rect);
        }
        else if(rect.height>S.top().height){
            S.push(rect);
        }
        else if(rect.height<S.top().height){
            int target=0; //changed later
            while(!S.empty() && rect.height<=S.top().height){
                Rectangle topRect=S.top(); S.pop();
                int area=topRect.height*(i-topRect.pos);
                maxv=max(maxv, area);
                target=topRect.pos;
            }
            rect.pos=target;
            S.push(rect);
        }
    }

    return maxv;
}

int H,W;
int Hist[1401][1401];

int solve(){
    int maxv=0;
    for(int i=0; i<H; i++){
        maxv=max(maxv, getLargestRectangle(W, Hist[i]));
    }

    return maxv;
}

int main(void){
    cin >> H >> W;
    int G[H][W];
    for(int i=0; i<H; i++){
        for(int j=0; j<W; j++){
            cin >> G[i][j];
        }
    }

    //ヒストグラムを作る
    for(int j=0; j<W; j++){
        for(int i=0; i<H; i++){
            if(G[i][j]==1) Hist[i][j]=0;
            else Hist[i][j]= (i>0)? Hist[i-1][j]+1 : 1;
        }
    }

    cout << solve() << endl;
}
