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;
int n;
int h, w;
long long int K;
int S[1403][1403];
stack<pair<int, int> > T;
void dp_init() {
  for (int i = 0; i < w; i++) {
    S[0][i] = 0;
    for (int j = 1; j <= h; j++) {
      S[j][i] = (S[j][i] == 1 ? 0 : (S[j - 1][i] + 1));
    }
  }
}
void solve() {
  int cnt = 0;
  int maxv = 0;
  int pos;
  for (int i = 1; i <= h; i++) {
    cnt = 0;
    for (int j = 0; j < w; j++) {
      if (T.empty())
        T.push(make_pair(cnt, S[i][j]));
      else if (T.top().second < S[i][j]) {
        T.push(make_pair(cnt, S[i][j]));
      } else if (T.top().second > S[i][j]) {
        while (!T.empty()) {
          if (T.top().second > S[i][j]) {
            maxv = max(maxv, (cnt - T.top().first) * T.top().second);
            pos = T.top().first;
            T.pop();
          } else {
            if (T.top().second < S[i][j]) T.push(make_pair(pos, S[i][j]));
            break;
          }
        }
        if (T.empty()) T.push(make_pair(cnt, S[i][j]));
      }
      cnt++;
    }
    while (!T.empty()) {
      maxv = max(maxv, (cnt - T.top().first) * T.top().second);
      T.pop();
    }
  }
  printf("%d\n", maxv);
}
int main() {
  scanf("%d %d", &h, &w);
  for (int i = 1; i <= h; i++) {
    for (int j = 0; j < w; j++) {
      scanf("%d", &S[i][j]);
    }
  }
  dp_init();
  solve();
  return 0;
}
