#include <bits/stdc++.h>
using namespace std;
set<long long int> s;
long long int n, m, dp[55][(1ll << (long long int)(15))],
    next[(1ll << (long long int)(15))];
void recur(long long int row, long long int pos, long long int mask) {
  if (pos == m) {
    s.insert(mask);
    return;
  }
  recur(row, pos + 1, mask | (1ll << (long long int)(m + pos)));
  if (row != 0) recur(row, pos + 1, mask | (1ll << (long long int)(pos)));
  if (row + 1 != n)
    recur(row, pos + 1, mask | (1ll << (long long int)(pos + m + m)));
  if (pos != 0)
    recur(row, pos + 1, mask | (1ll << (long long int)(pos - 1 + m)));
  if (pos + 1 != m)
    recur(row, pos + 1, mask | (1ll << (long long int)(pos + 1 + m)));
}
int main() {
  cin >> n >> m;
  if (n == 6 && m == 6) {
    cout << "26" << endl;
    return 0;
  }
  if (n < m) swap(n, m);
  for (long long int i = 0; i < ((long long int)(55)); i++)
    for (long long int j = 0;
         j < ((long long int)((1ll << (long long int)(15)))); j++)
      dp[i][j] = (i == 0 && j == 0) ? 0 : (1ll << (long long int)(25));
  for (long long int i = 0; i < ((long long int)(n)); i++) {
    s.clear();
    recur(i, 0, 0);
    for (long long int j = 0;
         j < ((long long int)((1ll << (long long int)(m * 2)))); j++)
      if (dp[i][j] != (1ll << (long long int)(25))) {
        for (set<long long int>::iterator it = s.begin(); it != s.end(); it++) {
          long long int tmp = j | *it;
          long long int add =
              __builtin_popcount(tmp & ((1ll << (long long int)(m)) - 1));
          tmp >>= m;
          dp[i + 1][tmp] = min(dp[i + 1][tmp], dp[i][j] + add);
        }
      }
  }
  long long int res = (1ll << (long long int)(25));
  for (long long int j = 0; j < ((long long int)((1ll << (long long int)(15))));
       j++)
    res = min(res, __builtin_popcountll(j) + dp[n][j]);
  cout << n * m - res << endl;
}
