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<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<cmath>
#include<climits>
#include<ctime>
#include<cstring>
#include<numeric>
#include<stack>

#define ALL(v) (v).begin(),(v).end()
#define REP(i,p,n) for(int i=p;i<(int)(n);++i)
#define rep(i,n) REP(i,0,n)
#define dump(a) (cerr << #a << "=" << (a) << endl)
#define DUMP(list) cout << "{ "; for(auto nth : list){ cout << nth << " "; } cout << "}" << endl;

using namespace std;

int main() {
	int H, W;
	cin >> H >> W;	
	vector<vector<int>>	tiles(H, vector<int>(W, 0));
	rep(i, H) {
		rep(j, W) {
			int c;	
			cin >> c;	
			tiles[i][j] = !c;	
		}
	}

	rep(i, W) {
		REP(j, 1, H) {
			tiles[j][i] += (!tiles[j][i]) ? 0 : tiles[j-1][i];
		}
	}

	long long res = 0;			
	for(const vector<int> &h : tiles) {
		vector<int> left(W, 0), right(W, 0);		
		stack<int> st;
		for(int i = 0; i < W; ++i) {
			while(!st.empty() && h[st.top()] >= h[i]) st.pop();	
			left[i] = (st.empty()) ? 0 : st.top() + 1; 
			st.push(i);
		}
		
		while(!st.empty()) st.pop();	
		
		for(int i = W - 1; i >= 0; --i) {
			while(!st.empty() && h[st.top()] >= h[i]) st.pop();	
			right[i] = (st.empty()) ? W : st.top(); 
			st.push(i);
		}

		for(int i = 0; i < W; ++i) {
			res = max(res, (long long)h[i] * (right[i] - left[i]));
		}
	}
	cout << res << endl;	
	return 0;
}