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;
using lint = long long int;
template <class T = int>
using V = vector<T>;
template <class T = int>
using VV = V<V<T> >;
template <class T>
void assign(V<T>& v, int n, const T& a = T()) {
  v.assign(n, a);
}
template <class T, class... Args>
void assign(V<T>& v, int n, const Args&... args) {
  v.resize(n);
  for (auto&& e : v) assign(e, args...);
}
int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  int h, w;
  cin >> h >> w;
  VV<> c;
  assign(c, h, w);
  for (int i = 0; i < h; ++i)
    for (int j = 0; j < w; ++j) cin >> c[i][j];
  int res = 0;
  for (int jl = 0; jl < w; ++jl) {
    V<> a(h);
    for (int i = 0; i < h; ++i) {
      int j = jl;
      while (j < w and !c[i][j]) ++a[i], ++j;
    }
    V<> l(h), r(h);
    stack<int> st;
    st.push(0);
    for (int i = 1; i < h; ++i) {
      while (!st.empty() and a[st.top()] >= a[i]) st.pop();
      l[i] = !st.empty() ? a[st.top()] * (i - st.top() - 1) : a[i] * i;
      st.push(i);
    }
    stack<int>().swap(st);
    st.push(h - 1);
    for (int i = h - 2; i >= 0; --i) {
      while (!st.empty() and a[st.top()] >= a[i]) st.pop();
      r[i] =
          !st.empty() ? a[st.top()] * (st.top() - 1 - i) : a[i] * (h - 1 - i);
      st.push(i);
    }
    for (int i = 0; i < h; ++i) res = max(res, l[i] + a[i] + r[i]);
  }
  cout << res << '\n';
}
