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>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define repr(i, n) for (int i = (n); i >= 0; --i)
#define FOR(i, m, n) for (int i = (m); i < (n); ++i)
#define FORR(i, m, n) for (int i = (m); i >= (n); --i)
#define equals(a, b) (fabs((a) - (b)) < EPS)
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
const ll mod2 = 998244353;
const int INF = 1000000005;
const long double EPS = 1e-10;
const int MAX = 1405;

struct Histogram {
  int h, id;
};


int h, w, c[MAX][MAX], t[MAX][MAX];

int solve() {
  int ans = 0;

  rep(i, h) {
    stack<Histogram> s;
    t[i][w] = 0;
    rep(j, w + 1) {
      Histogram rect;
      rect.h = t[i][j];
      rect.id = j;
      if (s.empty()) s.push(rect);
      else {
        if (s.top().h < rect.h) {
          s.push(rect);
        }
        else if (s.top().h > rect.h) {
          int target = j;
          while (!s.empty() && s.top().h >= rect.h) {
            Histogram pre = s.top();
            s.pop();
            int area = pre.h * (j - pre.id);
            ans = max(ans, area);
            target = pre.id;
          }
          rect.id = target;
          s.push(rect);
        }
      }
    }
  }

  return ans;
}

int main() {
  cin >> h >> w;
  rep(i, h) {
    rep(j, w) {
      cin >> c[i][j];
    }
  }

  rep(j, w) {
    rep(i, h) {
      if (c[i][j] == 1) t[i][j] = 0;
      else {
        if (i == 0) t[i][j] = 1;
        else t[i][j] = t[i - 1][j] + 1;
      }
    }
  }

  cout << solve() << endl;

}
