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 arr[100005];
int n;
int f;
int matriz[1405][1405];
int dist[1405][1405];
int rigth[1405][1405];
int lef[1405][1405];
int temp;
deque<int> pila;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> f;
  for (int i = 0; i < n; i++) {
    for (int k = 0; k < f; k++) {
      cin >> temp;
      matriz[i][k] = temp;
    }
  }
  for (int j = 0; j < f; j++) {
    int cont = 0;
    for (int i = n - 1; i >= 0; i--) {
      if (matriz[i][j] == 0) {
        cont++;
        dist[i][j] = cont;
      } else {
        cont = 0;
        dist[i][j] = 0;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    pila.clear();
    for (int j = 0; j < f; j++) {
      if (pila.size() == 0) {
        lef[i][j] = -1;
        pila.push_back(j);
      } else {
        while (true) {
          if (pila.size() == 0) {
            lef[i][j] = -1;
            pila.push_back(j);
            break;
          }
          if (dist[i][j] <= dist[i][pila.back()]) {
            pila.pop_back();
          } else {
            lef[i][j] = pila.back();
            pila.push_back(j);
            break;
          }
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {
    pila.clear();
    for (int j = f - 1; j >= 0; j--) {
      if (pila.size() == 0) {
        rigth[i][j] = f;
        pila.push_back(j);
      } else {
        while (true) {
          if (pila.size() == 0) {
            rigth[i][j] = f;
            pila.push_back(j);
            break;
          }
          if (dist[i][j] <= dist[i][pila.back()]) {
            pila.pop_back();
          } else {
            rigth[i][j] = pila.back();
            pila.push_back(j);
            break;
          }
        }
      }
    }
  }
  int max = -1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < f; j++) {
      if (dist[i][j] > 0) {
        int temp = dist[i][j] * ((rigth[i][j] - 1) - (lef[i][j] + 1) + 1);
        if (max < temp) max = temp;
      }
    }
  }
  cout << max << '\n';
  return 0;
}
