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 largest_square(const int H, const int W, const vector<vector<int>>& cells) {
  vector<vector<int>> table(H, vector<int>(W + 1));
  for (int w = 0; w < (int)(W); ++w) {
    for (int h = 0; h < (int)(H); ++h) {
      auto val = cells[h][w];
      if (val == 1)
        table[h][w] = 0;
      else {
        if (h == 0)
          table[h][w] = 1;
        else
          table[h][w] = table[h - 1][w] + 1;
      }
    }
  }
  for (int h = 0; h < (int)(H); ++h) {
    for (int w = 0; w < (int)(W + 1); ++w) {
      cerr << table[h][w] << " ";
    }
    cerr << endl;
  }
  int ans = 0;
  for (int h = 0; h < (int)(H); ++h) {
    stack<pair<int, int>> s;
    for (int w = 0; w < (int)(W + 1); ++w) {
      auto height = table[h][w];
      if (s.empty())
        s.push(make_pair(height, w));
      else if (s.top().first < height)
        s.push(make_pair(height, w));
      else if (s.top().first > height) {
        while (!s.empty() && s.top().first > height) {
          auto area = (w - s.top().second) * s.top().first;
          ans = max(area, ans);
          s.pop();
        }
      }
    }
  }
  return ans;
}
int main() {
  int H, W;
  cin >> H >> W;
  vector<vector<int>> cells(H, vector<int>(W));
  for (int h = 0; h < (int)(H); ++h) {
    for (int w = 0; w < (int)(W); ++w) {
      cin >> cells[h][w];
    }
  }
  cout << largest_square(H, W, cells) << endl;
  return 0;
}
