#include <fstream>
using namespace std;
ifstream fi("flip.in");
ofstream fo("flip.out");
int matrix[100][100], M, N, maxm = 0;
int sum_op(int av[100][100], int r_len, int c_len, int idx, bool rc);
void row(int av[100][100], int r_len, int c_len, int r_idx, int maxm);
void col(int av[100][100], int r_len, int c_len, int c_idx, int maxm);
void read(int av[100][100], int &r_len, int &c_len)
{
// printf("Linii si coloane: ");
fi >> r_len >> c_len;
for (int i = 0; i < r_len; i++) {
for (int j = 0; j < c_len; j++) {
fi >> av[i][j];
}
}
}
int main()
{
read(matrix, M, N);
row(matrix, M, N, 0, maxm);
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
maxm += matrix[i][j];
}
}
fo << maxm;
fi.close();
fo.close();
return 0;
}
int sum_op(int av[100][100], int r_len, int c_len, int idx, bool rc)
{
int i, s = 0;
/*
Booleanul rc este un indice de control care retine indexul randului/coloanei
pe care trebuie executata procedura. Pentru valoarea 0 se va face suma de pe
un anumit rand, iar pentru valoarea 1 se va face suma de pe o coloana.
*/
if (!rc) {
for (i = 0; i < c_len; i++) {
s += av[idx][i];
}
}
else {
for (i = 0; i < r_len; i++) {
s += av[i][idx];
}
}
return s;
}
void row(int av[100][100], int r_len, int c_len, int r_idx, int maxm)
{
int static lst_idx = 0;
if (lst_idx == r_idx || r_idx == r_len) {
if (r_idx != r_len)
{
row(av, r_len, c_len, r_idx + 1, maxm);
}
}
else {
int i;
if (sum_op(av, r_len, c_len, r_idx, 0) < 0) {
for (i = 0; i < c_len; i++) {
av[r_idx][i] *= (-1);
}
lst_idx = r_idx;
col(av, r_len, c_len, 0, maxm);
}
else {
row(av, r_len, c_len, r_idx + 1, maxm);
}
}
}
void col(int av[100][100], int r_len, int c_len, int c_idx, int maxm)
{
int static lst_idx;
if (lst_idx == c_idx || c_idx == c_len) {
if (c_idx != c_len)
{
col(av, r_len, c_len, c_idx + 1, maxm);
}
}
else {
int i;
if (sum_op(av, r_len, c_len, c_idx, 1) < 0) {
for (i = 0; i < r_len; i++) {
av[i][c_idx] *= (-1);
lst_idx = c_idx;
row(av, r_len, c_len, 0, maxm);
}
}
else {
col(av, r_len, c_len, c_idx + 1, maxm);
}
}
}