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 <vector>
#include <algorithm>

using namespace std;

int dp[1400][1401];

size_t get_largest_rectangle(vector<vector<int>> &g) {
    size_t h=g.size(), w=g[0].size();

    for (size_t i=0; i<h; ++i)
        for (size_t j=0; j<w; ++j)
            dp[i][j] = !g[i][j];

    for (size_t i=1; i<h; ++i)
        for (size_t j=0; j<w; ++j)
            if (dp[i][j])
                dp[i][j] += dp[i-1][j];

    size_t max_area=0;
    for (size_t i=0; i<h; ++i)
        for (size_t j=0; j<w; ++j) {
            if (!dp[i][j]) continue;

            int min_height=dp[i][j];
            for (size_t k=j+1; k<=w; ++k) {
                if (max_area < (k-j)*min_height)
                    max_area = (k-j)*min_height;

                if (!dp[i][k])
                    break;

                if (min_height > dp[i][k])
                    min_height = dp[i][k];
            }
        }

    return max_area;
}

int main() {
    size_t h, w;
    scanf("%zu %zu", &h, &w);

    vector<vector<int>> g(h, vector<int>(w));
    for (size_t i=0; i<h; ++i)
        for (size_t j=0; j<w; ++j)
            scanf("%d", &g[i][j]);

    printf("%zu\n", get_largest_rectangle(g));
    return 0;
}