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;
int main(void) {
  long long H, W;
  cin >> H >> W;
  long long c[H][W];
  long long up[H][W];
  long long left[H][W];
  long long ans = 0;
  long long min;
  for (int i = 0; i < ((int)(H)); i++) {
    for (int j = 0; j < ((int)(W)); j++) {
      cin >> c[i][j];
      if (c[i][j] == 0) {
        if (i == 0) {
          up[0][j] = 1;
        } else {
          up[i][j] = up[i - 1][j] + 1;
        }
        if (j == 0) {
          left[i][0] = 1;
        } else {
          left[i][j] = left[i][j - 1] + 1;
        }
      } else {
        up[i][j] = 0;
        left[i][j] = 0;
      }
      min = LLONG_MAX;
      for (int k = 0; k < ((int)(up[i][j])); k++) {
        if (left[i - k][j] < min) {
          min = left[i - k][j];
        }
      }
      if (ans < min * up[i][j]) ans = min * up[i][j];
      min = LLONG_MAX;
      for (int k = 0; k < ((int)(left[i][j])); k++) {
        if (up[i][j - k] < min) {
          min = up[i][j - k];
        }
      }
      if (ans < min * left[i][j]) ans = min * left[i][j];
    }
  }
  cout << ans << endl;
  return 0;
}
