//#include <assert.h>
const int maxn=2010;
char map[maxn][maxn];
int n,m;
int ans=0;
void init()
{
scanf("%d%d",&n,&m);
bool flag=0;
for (int i=1;i<=n ;i++ ){
for (int j = 1; j <= m ; j++){
char t;
do
{
t=getchar() - '0';
}
while ( (t | 1) != 1);
flag |= (map[i][j] = t);
//assert(map[i][j]==0 || map[i][j]==1);
//putchar(map[i][j]+'0');
}
}
if (!flag) //1都没有
printf("0\n");
}
void work1()//找出最大的纯1矩阵
{
//横向的
ans=1;
for (int i = 1 ; i <= n ; i++){
int t1 = 0 , t2 = 0;
for (int j = 1 ; j <= m ; j++){
if (map[i][j]) ans >?= ++t1;
else t1 = 0;
if (map[i][j] && map[i+1][j]) ans >?= (t2 += 2);
else t2 = 0;
}
}
for (int i = 1 ; i <= m ; i++){
int t1 = 0 , t2 = 0;
for (int j = 1 ; j <= n ; j++){
if (map[j][i]) ans >?= ++t1;
else t1 = 0;
if (map[j][i] && map[j][i+1]) ans >?= (t2 += 2);
else t2 = 0;
}
}
//printf("ans = %d\n",ans);
}
bool used[maxn][maxn];
int max_row,max_column,min_row,min_column;
int sum;
void floodfill(int x, int y)
{
if (map[x][y] || used[x][y] || x > n || x < 1 || y > m || y < 1)
return;
sum++;
max_row >?= x;
min_row <?= x;
max_column >?= y;
min_column <?= y;
used[x][y] = 1;
floodfill(x, y+1);
floodfill(x, y-1);
floodfill(x-1, y);
floodfill(x+1, y);
}
void work0()
{
for (int i = 1; i <= n; i++)
for (int j = 1 ; j <= m ; j++)
if (!map[i][j] && !used[i][j]){
sum = 0;
max_row = min_row = i;
max_column = min_column = j;
floodfill(i,j);
if (max_row < n && min_row > 1 &&
max_column < m && min_column > 1 &&
sum == (max_row - min_row + 1) * (max_column - min_column + 1) &&
map[max_row+1][max_column+1] && map[max_row+1][min_column-1] &&
map[min_row-1][max_column+1] && map[min_row-1][min_column-1])
ans >?= (max_row - min_row + 1 + 2) * (max_column - min_column + 1 + 2);
}
}
int main(int argc, char *argv[])
{
init();
work1();
work0();
printf("%d\n" , ans);
return 0;
}
n,i:longint;
a:array[1..100]of longint;
procedure mk(i:longint);
var j,t:longint;flag:boolean;
begin
j:=i*2;
while j<=n do
begin
flag:=false;
if (j<n)and(a[j]>a[j+1]) then inc(j);
if a[i]>a[j] then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
i:=j;j:=j*2;
flag:=true;
end;
if not flag then exit;
end;
end;
begin
readln(n);
for i:=1 to n do
read(a[i]);
for i:=(n div 2) downto 1 do
mk(i);
for i:=1 to n do
begin
write(a[1],' ');
a[1]:=a[n];
dec(n);
mk(1);
end;
end.