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;
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<ll> VL;
typedef vector<VL> VVL;
typedef pair<int, int> PII;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define MOD 1000000007
#define INF (1LL<<30)
#define LLINF (1LL<<60)
#define PI 3.14159265359
#define EPS 1e-12
//#define int ll

int n, c[1500][1500], dp[1500][1500], l[1500], r[1500];
signed main(void)
{
  int H, W;
  cin >> H >> W;
  REP(i, H) REP(j, W) cin >> c[i][j];

  REP(i, H) REP(j, W) {
    if(c[i][j]) dp[i][j] = 0;
    else {
      if(!i) dp[i][j] = 1;
      else dp[i][j] = dp[i-1][j] + 1;
    }
  }
  ll ret = 0;
  REP(j, H) {
    stack<int> st;
    REP(i, W) {
      while(st.size() && dp[j][st.top()] >= dp[j][i]) st.pop();
      if(!st.size()) l[i] = i;
      else l[i] = i-st.top()-1;
      st.push(i);
    }
    while(st.size()) st.pop();
    for(int i=W-1; i>=0; --i) {
      while(st.size() && dp[j][st.top()] >= dp[j][i]) st.pop();
      if(!st.size()) r[i] = W-i-1;
      else r[i] = st.top()-i-1;
      st.push(i);
    }
    REP(i, W) ret = max(ret, (ll)dp[j][i]*(r[i]+l[i]+1));
  }
  cout << ret << endl;
  return 0;
}