#include<fstream>
#include<iostream>
using namespace std;
int **alocaMatrice(int n,int m)
{
int **matrice = new int *[n];
for(int i=0;i<n;++i)
matrice[i] = new int[m];
return matrice;
}
void dealocaMatrice(int **matrice,int n)
{
for(int i=0;i<n;++i)
delete []matrice[i];
delete[] matrice;
}
void bordeazaMatriceaCuSumaElem(int **matrice,int n,int m)
{
int suma = 0;
int i,j;
//mai intai pe coloane
for(i=0;i<n;++i)
{
suma = 0;
for(j=0;j<m;++j)
{
suma += matrice[i][j];
}
matrice[i][j] = suma;
}
//apoi pe linii
for(i=0;i<m;++i)
{
suma = 0;
for(j=0;j<n;++j)
{
suma += matrice[j][i];
}
matrice[n][i] = suma;
}
matrice[n][m] = -1111111;
}
void afiseazaMatrice(int **matrice,int n,int m)
{
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
cout<<matrice[i][j]<<" ";
}
cout<<endl;
}
}
int sumForFlippedColumn(int **matrice,int n,int coloana)
{
int suma =0 ;
for(int i=0;i<n;++i)
suma += matrice[i][coloana] * -1;
return suma;
}
int sumForFlippedLine(int **matrice,int m,int line)
{
int suma =0 ;
for(int i=0;i<m;++i)
suma += matrice[line][i] * -1;
return suma;
}
void flipColumnValues(int **matrice,int n,int coloana)
{
for(int i=0;i<n;++i)
matrice[i][coloana] *= -1;
}
void flipLineValues(int **matrice,int m,int line)
{
for(int i=0;i<m;++i)
matrice[line][i] *= -1;
}
void updateBottomBorderForFlippedLine(int **matrice,int n,int m,int line)
{
for(int j=0;j<m;++j)
{
matrice[n][j] += matrice[line][j];
}
}
void updateRightBorderForFlippedColumn(int **matrice,int n,int m,int column)
{
for(int j=0;j<n;++j)
{
matrice[j][m] += matrice[j][column];
}
}
int sumaTotala(int **matrice,int n,int m)
{
int suma = 0;
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
suma += matrice[i][j];
}
}
return suma;
}
#define SUMA_PE_LINIA_CURENTA matrice[i][m]
#define SUMA_PE_COLOANA_CURENTA matrice[n][j]
int main()
{
ifstream fin("flip.in");
ofstream fout("flip.out");
int n,m;
fin>>n>>m;
//aloca si pentru bordura
int **matrice = alocaMatrice(n+1,m+1);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
fin>>matrice[i][j];
bordeazaMatriceaCuSumaElem(matrice,n,m);
//cautam numere negative
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
if(matrice[i][j]<0)
{
int sumFlCol = matrice[n][j]*-1;//sumForFlippedColumn(matrice,n,j);
//daca e mai mare decat suma curenta pe coloana
bool columnFlipped = false;
if(sumFlCol > SUMA_PE_COLOANA_CURENTA)
{
flipColumnValues(matrice,n,j);
//actualizeaza border pentru coloana
matrice[n][j] = sumFlCol;//*= -1;
updateRightBorderForFlippedColumn(matrice,n,m,j);
columnFlipped = true;
}
int sumFlLine = matrice[i][m]*-1;//sumForFlippedLine(matrice,m,i);
if(sumFlLine > SUMA_PE_LINIA_CURENTA )
{
//if(columnFlipped)
// {//
// if(sumFlLine*2 > matrice[i][j]*-2)
// {
//flip line too
flipLineValues(matrice,m,i);
//actualizeaza profitul pe linie
matrice[i][m] =sumFlLine;//*=-1;
updateBottomBorderForFlippedLine(matrice,n,m,i);
//}
/*}
else
{
if(sumFlLine*2 > matrice[i][j]*-2)
{
flipLineValues(matrice,m,i);
//actualizeaza profitul pe linie
matrice[i][m] *=-1;
updateBottomBorderForFlippedLine(matrice,n,m,i);
}
}*/
}
}
}
}
int sumaT = sumaTotala(matrice,n,m);
fout<<sumaT;
dealocaMatrice(matrice,n);
fin.close();
fout.close();
return 0;
}