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;
const long long INF = 1ll << 62ll;
struct edge {
  long long from, to, cost;
};
long long dr[] = {-1, 0, 1, 0};
long long dc[] = {0, 1, 0, -1};
template <typename T = long long>
vector<vector<T>> vvector(long long h, long long w, T def = T()) {
  return move(vector<vector<T>>(h, vector<T>(w, def)));
}
class range {
 private:
  struct I {
    long long x;
    long long operator*() { return x; }
    bool operator!=(I& lhs) { return x < lhs.x; }
    void operator++() { ++x; }
  };
  I i, n;

 public:
  range(long long n) : i({0}), n({n}) {}
  range(long long i, long long n) : i({i}), n({n}) {}
  I& begin() { return i; }
  I& end() { return n; }
};
signed main() {
  long long h, w;
  while (cin >> h >> w && h) {
    auto dp = vvector(h, w + 1);
    long long ans = 0;
    for (signed i = (0); i < signed(h); i++) {
      stack<pair<long long, long long>> st;
      st.push(pair<long long, long long>(0, 0));
      for (signed j = (0); j < signed(w + 1); j++) {
        long long x = 0;
        if (j < w) cin >> x;
        if (!x) dp[i][j] = 1;
        if (i >= 1 && dp[i - 1][j] && !x) dp[i][j] = dp[i - 1][j] + 1;
        long long size = dp[i][j];
        if (size == st.top().first)
          continue;
        else if (size > st.top().first)
          st.push(pair<long long, long long>(size, j));
        else {
          long long beg = j;
          while (!st.empty() && st.top().first > size) {
            pair<long long, long long> p = st.top();
            st.pop();
            ans = max(ans, (j - p.second) * p.first);
            beg = p.second;
          }
          if (st.top().first == size)
            ans = max(ans, (j - st.top().second + 1) * st.top().first);
          else
            st.push(pair<long long, long long>(size, beg));
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}
