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 <stack>
#include <algorithm>
using namespace std;

struct Val {
    int height;
    int pos;
};

int h;
int w;
int ans;
int c[1401][1401];
int suc[1401][1401];

int main() {
    scanf("%d%d", &h, &w);
    for (int i=0; i<h; i++) {
        for (int j=0; j<w; j++) {
            scanf("%d", &c[i][j]);
            c[i][j] ^= 1;
            suc[i][j] = c[i][j];
        }
    }

    for (int i=1; i<h; i++) {
        for (int j=0; j<w; j++) {
            if (c[i][j]) {
                suc[i][j] = suc[i-1][j]+1;
            } else {
                suc[i][j] = 0;
            }
        }
    }
            
    for (int i=0; i<h; i++) {
        stack<struct Val> st;
        
        for (int j=0; j<=w; j++) {
            struct Val v;
            int newpos = j;

            v.height = suc[i][j];
            while (!st.empty() && st.top().height >= v.height) {
                struct Val pre = st.top(); st.pop();
                int area = pre.height * (j - pre.pos);
                ans = max(ans, area);
                newpos = pre.pos;
            }
            v.pos = newpos;
            st.push(v);
        }
    }

    printf("%d\n", ans);
}