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[][] c = new int[h][w];// c[i][j]==0???????????¨??????
		int[][] cum = new int[h][w];
		for (int i = 0; i < h; ++i) {
			for (int j = 0; j < w; ++j) {
				c[i][j] = sc.nextInt();
				if (c[i][j] == 0) {
					if (i != 0) {
						cum[i][j] += cum[i - 1][j];
					}
					cum[i][j]++;
				}
			}
		}

		int ans = 0;
		for (int i = 0; i < h; ++i) {
			ArrayDeque<List<Integer>> stack = new ArrayDeque<>();
			for (int j = 0; j < w; ++j) {
				ans = Math.max(ans, cum[i][j]);
				int d = j;
				while (!stack.isEmpty() && (c[i][j] == 1 || stack.peekLast().get(0) > cum[i][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 (c[i][j] == 1)
					continue;
				stack.addLast(Arrays.asList(cum[i][j], d));
			}
			while (!stack.isEmpty()) {
				List<Integer> pair = stack.pollLast();
				ans = Math.max(ans, pair.get(0) * (w - pair.get(1)));
			}
		}
		System.out.println(ans);

	}

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