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<stdio.h>
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
#define MAX 1400
struct Rectangle{int height; int pos;};

int getLargestRectangle(int size,int buffer[])
{
  stack<Rectangle> S;
  int maxv=0;
  buffer[size]=0;
  for(int i=0;i<=size;i++)
    {
      Rectangle rect;
      rect.height=buffer[i];
      rect.pos=i;
      if(S.empty())
	{
	  S.push(rect);
	}
      else
	{
	  if(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);
		  maxv=max(maxv,area);
		  target=pre.pos;
		}
	      rect.pos=target;
	      S.push(rect);
	    }
	}
    }
  return maxv;
}

int H,W;
int buffer[MAX][MAX];
int T[MAX][MAX];

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


int main(void)
{
  scanf("%d %d",&H,&W);
  for(int i=0;i<H;i++)
    {
      for(int j=0;j<W;j++)
	{
	  scanf("%d",&buffer[i][j]);
	}
    }
  cout << getLargestRectangle() << endl;
  return 0;
}