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 VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;
template <class S, class T>
istream& operator>>(istream& is, pair<S, T>& p) {
  return is >> p.first >> p.second;
}
template <class T>
istream& operator>>(istream& is, vector<T>& xs) {
  for (auto& x : xs) is >> x;
  return is;
}
template <class S, class T>
ostream& operator<<(ostream& os, const pair<S, T>& p) {
  return os << p.first << " " << p.second;
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& xs) {
  for (unsigned int i = 0; i < xs.size(); ++i) os << (i ? " " : "") << xs[i];
  return os;
}
template <class T>
void maxi(T& x, T y) {
  if (x < y) x = y;
}
template <class T>
void mini(T& x, T y) {
  if (x > y) x = y;
}
const double EPS = 1e-10;
const double PI = acos(-1.0);
const LL MOD = 1e9 + 7;
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  int H, W;
  cin >> H >> W;
  VVI xs(H, VI(W));
  cin >> xs;
  for (int y = (0); y < (H); ++y)
    for (int x = (0); x < (W); ++x) {
      xs[y][x] ^= 1;
      if (xs[y][x]) xs[y][x] += (y > 0 ? xs[y - 1][x] : 0);
    }
  int ans = 0;
  for (int y = (0); y < (H); ++y) {
    stack<PII> s;
    for (int x = (0); x < (W); ++x) {
      while (!s.empty() && s.top().first > xs[y][x]) {
        maxi(ans, s.top().first * (x - s.top().second));
        s.pop();
      }
      if (xs[y][x]) s.emplace(xs[y][x], x);
    }
    while (!s.empty()) {
      maxi(ans, s.top().first * (W - s.top().second));
      s.pop();
    }
  }
  cout << ans << endl;
  return 0;
}
