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 <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <bitset>
using namespace std;

#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define rep(i,n) repl(i,0,n)
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout<<#x"="<<x<<endl
#define fi first
#define se second

#define INF 2147483600
typedef pair<int, int> P;

int mat[1500][1500];

int main(){
  int h,w;
  cin>>h>>w;

  rep(i,h)rep(j,w) scanf("%d", &mat[i][j]);

  // convert matrix to vertiacl succeeding numbers
  rep(i,h)rep(j,w){
    if(i==0){
      mat[i][j] = !mat[i][j];
      continue;
    }
    if(mat[i][j]==0) mat[i][j] = mat[i-1][j]+1;
    else mat[i][j] = 0;
  }

  // see matrix row as a histogram to make the largert rectangle
  int res = 0;
  rep(i,h){
    mat[i][w] = 0;
    stack<P> st;
    rep(j,w+1){
      int d=mat[i][j];
      if(st.empty()) st.push(mp(j,d));
      else if(st.top().se < d) st.push(mp(j,d));
      else if (st.top().se > d){
        int last = j;
        while(!st.empty() && st.top().se > d){
          P p = st.top(); st.pop();
          res = max(res, (j-p.fi)*p.se);
          last = p.fi;
        }
        st.push(mp(last,d));
      }
    }
  }

  cout<<res<<endl;

  return 0;
}