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<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<stack>
#include<queue>

using namespace std;

struct Rect{int h; int w_pos;}; //w_position

int main(){
	int c[1401][1401];
	int t1[1401];
	int H,W;
	int ans=0,sbans;
	scanf("%d %d",&H,&W);
	for(int i=0;i<=H;i++) c[i][0]=0;
	for(int i=0;i<=W;i++) c[0][i]=0;
	for(int i=0;i<=W;i++) t1[i]=0;
	for(int i=1;i<=H;i++){
		for(int j=1;j<=W;j++){
			scanf("%d ",&c[i][j]);
			if(c[i][j]==0) c[i][j]=1;
			else c[i][j]=0;
		}
	}
	for(int i=1;i<=H;i++){
		for(int j=1;j<=W;j++){
			if(c[i][j]==1)
			c[i][j]=c[i-1][j]+1;
			else
			c[i][j]=0;
		}
	}
	for(int i=1;i<=H;i++){
		stack<Rect> s;
		sbans=0;
		for(int j=1;j<=W+1;j++){
			Rect rect;
			rect.h = c[i][j];
			rect.w_pos = j;
			if(s.empty()) s.push(rect);
			else{
				if(s.top().h < rect.h) s.push(rect);
				else if(s.top().h > rect.h){
					int t=j;
					while(!s.empty() && s.top().h >= rect.h){
						Rect pre=s.top();
						s.pop();
						int area=pre.h * (j-pre.w_pos);
						sbans = max(sbans,area);
						t=pre.w_pos;
					}
					rect.w_pos=t;
					s.push(rect);
				}
			}
		}
		ans=max(ans,sbans);
	}
	printf("%d\n",ans);
}
