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;
struct cww{cww(){ios::sync_with_stdio(false);cin.tie(0);}}star;
#define P(x) cout << (x) << "\n"
#define p(x) cout << (x)
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define vv(type, c, m, n, i) vector<vector<type>> c(m, vector<type>(n, i));
#define rep(i,a,n) for(int i=(a), i##_len=(n); i<i##_len; ++i)
#define rrep(i,a,n) for(int i=(a), i##_len=(n); i>i##_len; --i)
#define len(x) ((int)(x).size())
#define mp make_pair
#define eb emplace_back
#define fi first
#define se second
#define chmax(a,b) if(a<b)a=b;
#define chmin(a,b) if(b<a)a=b;
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<double> vd;
typedef vector<long long> vll;
typedef vector<string> vs;
typedef vector<bool> vb;
constexpr int MAX = 1400;
struct Rectangle { int height, pos; };
int getLargestRectangle(int size, vi buffer) {
	vector<Rectangle> S;
	int maxv = 0;
	buffer[size] = 0;
	int target, area;
	rep(i, 0, size + 1) {
		Rectangle rect;
		rect.height = buffer[i];
		rect.pos = i;
		if(S.empty()) S.eb(rect);
		else {
			if(S.back().height < rect.height) S.eb(rect);
			else if(S.back().height > rect.height) {
				target = i;
				while(!S.empty() && S.back().height >= rect.height) {
					Rectangle pre = S.back(); S.pop_back();
					area = pre.height * (i - pre.pos);
					chmax(maxv, area);
					target = pre.pos;
				}
				rect.pos = target;
				S.eb(rect);
			}
		}
	}
	return maxv;
}
int H, W;
vv(int, buffer, MAX, MAX, 0);
vv(int, T, MAX, MAX, 0);
int getLargestRectangle() {
	rep(j, 0, W) {
		rep(i, 0, H) {
			if(buffer[i][j]) T[i][j] = 0;
			else T[i][j] = (i > 0) ? T[i - 1][j] + 1 : 1;
		}
	}
	int maxv = 0;
	rep(i, 0, H) chmax(maxv, getLargestRectangle(W, T[i]));
	return maxv;
}
int main() {
	cin >> H >> W;
	rep(i, 0, H) rep(j, 0, W) cin >> buffer[i][j];
	P(getLargestRectangle());
	return 0;
}