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<algorithm>
#include<stack>
using namespace std;


static const int MAX = 1405;
int G[MAX][MAX], T[MAX][MAX];

struct Rectangle
{
	int height, pos;
};

int getLargestRectangle(int W, int buffer[]) {
 	stack<Rectangle> s;
 	int maxRect = 0;
 	buffer[W] = 0;

 	for( int i = 0; i <= W; i++) {
        Rectangle rect;
        rect.height = buffer[i];
        rect.pos = i;

        if( s.empty() || s.top().height < rect.height ) {
        	s.push( rect );
        } else  if ( s.top().height > rect.height) {
        		int target = i;
        		while( !s.empty() && s.top().height > rect.height ) {
        		Rectangle pre = s.top(); s.pop();
        		int area = pre.height * ( i - pre.pos );
        		maxRect = max(maxRect, area);
        		target = pre.pos;
        	   }
        	   rect.pos = target;
        	   s.push(rect);
        	}
 
 	}

 	return maxRect;
}
int getLargestRectangle( int H, int W ) {
	for( int i = 0; i < H; i++) {
		for( int j = 0; j < W; j++ ) {
			if ( G[i][j] ) T[i][j] = 0;
			else {
				T[i][j] = ( i > 0 ) ? T[i - 1][j] + 1 : 1;
			}
		}
	}

    int maxRect = 0;
    for ( int i = 0; i < H; i++) {
    	maxRect = max( maxRect, getLargestRectangle(W, T[i]));
    }

    return maxRect;
}
int main() {
	int H, W;

	cin >> H >> W;
	for( int i = 0; i < H; i++ )
		for( int j =0; j < W; j++ ) cin >> G[i][j];

	cout << getLargestRectangle( H, W ) << endl;

}

