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 <stack>
#include <vector>
#include <iostream>
struct State {
	int size, index;
	void set(const int &i) {
		size = size * i + i;
	}
	State(int s = 0, int i = 0) :size(s), index(i) {};
};

int maximum(std::vector<int> &state) {
	std::stack<State> stack;
	stack.push(State());
	int max = 0;
	for (auto i = 0; i < state.size(); ++i) {
		if (state.at(i) > stack.top().size) {
			stack.push(State(state.at(i), i));
		}
		else {
			auto temp = stack.top();
			while (stack.top().size > state.at(i)) {
				temp = stack.top();
				if (max < (i - stack.top().index) * stack.top().size) {
					max = (i - stack.top().index) * stack.top().size;
				}
				stack.pop();
			}
			temp.size = state.at(i);
			stack.push(temp);
		}
	}
	return max;
}
struct Container {
	std::vector<int> *now, *prev;
	Container(const int &n = 0) :now{ new std::vector<int>(n, 0) }, prev{ new std::vector<int>(n, 0) } { };
	int &at(const int &i) { return now->at(i); }
	int &at2(const int &i) { return prev->at(i); }
	std::vector<int> &get_now() { return *now; }
	void swit() { auto temp = now; now = prev; prev = temp; }

};
int main() {
	int h, w;
	std::cin >> h >> w;
	Container vector(w + 1);
	int max = 0;
	for (auto i = 0; i < h; ++i) {
		for (auto j = 0; j < w; ++j) {
			int c;
			std::cin >> c;
			vector.at(j) = (vector.at2(j) + 1) * (1 - c);
		}
		auto temp = maximum(vector.get_now());
		if (temp > max) {
			max = temp;
		}
		vector.swit();
	}
	std::cout << max << std::endl;
}