#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 35  //const int N(35);
#define REP(i,n) for (int i=0;i<(n);i++)
struct bign
{
	int len,s[N];
	bign()  {  memset(s,0,sizeof(s));  len=1;  }
	bign(int num)  {  *this=num; }
	bign(char *num) { *this=num; }
	bign operator =(int num)
	{
		char c[N];
		sprintf(c,"%d",num);
		*this=c;
		return *this;
	}
	bign operator =(const char *num)
	{
		len=strlen(num);
		REP(i,len) s[i]=num[len-1-i]-'0';
		return *this;
	}
	string str()
	{
		string res="";
		REP(i,len) res=(char)(s[i]+'0')+res;
		return res;
	}
	void clean()
	{
		while (len>1&&!s[len-1]) len--;
	}
	bign operator +(const bign &b)
	{
		bign c;		
		c.len=0;
		for (int i=0,g=0;g||i<len||i<b.len;i++)
		{
			int x=g;
			if (i<len) x+=s[i];
			if (i<b.len) x+=b.s[i];
			c.s[c.len++]=x%10;
			g=x/10;
		}
		return c;
	}
	bign operator -(const bign &b)
	{
		bign c;
		c.len=0;
		int x;		
		for (int i=0,g=0;i<len;i++)
		{
			x=s[i]-g;
			if (i<b.len) x-=b.s[i];
			if (x>=0) g=0;
			else{			
				x+=10;
				g=1;
			};
			c.s[c.len++]=x;
		}
		c.clean();
		return c;
	}
	bign operator *(const bign &b)
	{
		bign c;
		c.len=len+b.len;
		REP(i,len) REP(j,b.len) c.s[i+j]+=s[i]*b.s[j];
		REP(i,c.len-1) { c.s[i+1]+=c.s[i]/10; c.s[i]%=10; }
		c.clean();
		return c;	
	}
	bool operator <(const bign &b)
	{
		if (len!=b.len) return len<b.len;
		for (int i=len-1;i>=0;i--)
			 if (s[i]!=b.s[i]) return s[i]<b.s[i];
		return false;
	}
	bign operator +=(const bign &b)
	{
		*this=*this+b;
		return *this;
	}
	bign operator -=(const bign &b)
	{
		*this=*this-b;
		return *this;
	}	
}; 
//istream& operator >>(istream &in,bign &x)
//{
//	string s;
//	in>>s;
//	x=s.c_str();
//	return in;
//}
ostream& operator <<(ostream &out,bign &x)
{
	out<<x.str();
	return out;
}
bign p[81],f[81][81],ans(0);
int n,m,a[81][81];
void init()
{
	//ifstream cin("game.in");  //freopen("game.in","r",stdin);
	cin>>n>>m;  //scanf("%d%d",&n,&m);
	REP(i,n) REP(j,m) cin>>a[i][j];  //scanf("%d",&a[i][j]);
	p[0]=1;  REP(i,m) p[i+1]=p[i]*2;
}
		
int main()
{
	init();
	REP(t,n){
		memset(f,0,sizeof(f));
		for (int k=1;k<=m;k++)
			for (int i=0;i<=k;i++)
			{
				if (i>0) f[k][i]=f[k-1][i-1]+p[k]*a[t][i-1];
				if (i<k&&f[k][i]<f[k-1][i]+p[k]*a[t][m-(k-i)]) f[k][i]=f[k-1][i]+p[k]*a[t][m-(k-i)];
			}
		bign maxn;
		for (int i=0;i<=m;i++)
			if (maxn<f[m][i]) 
				maxn=f[m][i];
		ans+=maxn;		
	}
	//ofstream cout("game.out");	
	cout<<ans<<endl;
	//system("pause");
	return 0;
}

/**************************************************************
	Problem: 2274
	User: admin
	Language: C++
	Result: Accepted
	Time:645 ms
	Memory:3040 kb
****************************************************************/