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;
#define rep(i, n) for (int i = 0; i < n; i++)

struct rectangle {int pos, height;};

int main() {
    int h, w;
    cin >> h;
    cin >> w;
    int tile[h+1][w+1];
    int dp[h+1][w+1];
    int max_area = 0;
    rep(i, h+1) {
        stack<rectangle> s;
        rep(j, w+1) {
            if (i == 0 || j == w) {
                dp[i][j] = 0;
            } else {
                cin >> tile[i][j];
                if (tile[i][j] == 0) {
                    dp[i][j] = dp[i-1][j] + 1;
                } else {
                    dp[i][j] = 0;
                }
            }
            if (s.empty() && dp[i][j] != 0) {
                s.push({j, dp[i][j]});
            } else if (not s.empty() && s.top().height < dp[i][j]) {
                s.push({j, dp[i][j]});
            } else if (not s.empty() && s.top().height > dp[i][j]) {
                int left;
                while (not s.empty() && s.top().height >= dp[i][j]) {
                    int area = (j - s.top().pos) * s.top().height;
                    max_area = max(max_area, area);
                    left = s.top().pos;
                    s.pop();
                }
                if (dp[i][j] != 0) {
                    s.push({left, dp[i][j]});
                }
            }
        }
    }
    // rep(i, h+1) {
    //     rep(j, w+1) {
    //         printf("%d ", dp[i][j]);
    //     }
    //     printf("\n");
    // }
    cout << max_area << endl;
}
