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
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

class Main {
	public static void main(String[] args) {
		new Main().run();
	}

	void run() {
		Scanner sc = new Scanner(System.in);
		int h = sc.nextInt();
		int w = sc.nextInt();
		int[][] cum = new int[2][w];
		int ans = 0;
		for (int i = 0; i < h; ++i) {
			System.gc();
			for (int j = 0; j < w; ++j) {
				int c = sc.nextInt();
				if (c == 0) {
					cum[i % 2][j] = (i > 0 ? cum[(i - 1) % 2][j] : 0) + 1;
				} else {
					cum[i % 2][j] = 0;
				}
			}
			ans = Math.max(ans, solve(cum[i % 2], w));
			
		}

		System.out.println(ans);

	}

	int solve(int[] cum, int w) {
		int ans = 0;
		ArrayDeque<List<Integer>> stack = new ArrayDeque<>();
		for (int j = 0; j < w; ++j) {
			ans = Math.max(ans, cum[j]);
			int d = j;
			while (!stack.isEmpty() && (cum[j] == 0 || stack.peekLast().get(0) > cum[j])) {
				List<Integer> pair = stack.pollLast();
				ans = Math.max(ans, pair.get(0) * (j - pair.get(1)));
				d = Math.min(d, pair.get(1));
			}
			if (cum[j] == 0)
				continue;
			stack.addLast(Arrays.asList(cum[j], d));
		}
		while (!stack.isEmpty()) {
			List<Integer> pair = stack.pollLast();
			ans = Math.max(ans, pair.get(0) * (w - pair.get(1)));
		}
		return ans;
	}

	void tr(Object... objects) {
		System.out.println(Arrays.deepToString(objects));
	}
}