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
//DPL_3B
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
 
static const int MAX=1400;

struct Rectangle{int height;int pos;};

int getLagestRectangle(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,getLagestRectangle(W,T[i]));
 }
 return maxv;
}

int main(){
 cin>>H>>W;
 for(int i=0;i<H;i++){
  for(int j=0;j<W;j++){
   cin>>buffer[i][j];
  }
 }
 cout<<getLargestRectangle()<<endl;
 return 0;
}