#include <bits/stdc++.h>
using namespace std;
const int N = 40, M = 100;
int n, m, mm, dp[N][M][M];
bool ok(int a, int b, int c) {
  for (int i = 1; i < m - 1; i++) {
    if (!((b >> i) & 1) && !((a >> i) & 1) && !((c >> i) & 1) &&
        !((b >> (i + 1)) & 1) && !((b >> (i - 1)) & 1)) {
      return false;
    }
  }
  if (!((b >> 0) & 1) && !((a >> 0) & 1) && !((c >> 0) & 1) && !((b >> 1) & 1))
    return false;
  if (!((b >> (m - 1)) & 1) && !((a >> (m - 1)) & 1) && !((c >> (m - 1)) & 1) &&
      !((b >> (m - 2)) & 1))
    return false;
  return true;
}
int main() {
  cin >> n >> m;
  if (n == 1 && m == 1) {
    cout << 0 << endl;
    return 0;
  }
  if (n < m) swap(n, m);
  for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++) fill(dp[i][j], dp[i][j] + M, INT_MAX);
  for (int i = 0; i < (1 << m); i++) {
    for (int j = 0; j < (1 << m); j++) {
      if (ok(0, i, j)) dp[0][i][j] = __builtin_popcount(i);
    }
  }
  for (int i = 1; i < n; i++) {
    for (int j = 0; j < (1 << m); j++) {
      for (int l = 0; l < (1 << m); l++) {
        int minn = INT_MAX;
        for (int p = 0; p < (1 << m); p++) {
          if (ok(p, j, l)) minn = min(minn, dp[i - 1][p][j]);
        }
        dp[i][j][l] = __builtin_popcount(j) + minn;
      }
    }
  }
  int ans = INT_MAX;
  for (int i = 0; i < (1 << m); i++) ans = min(ans, dp[n - 1][i][0]);
  cout << (n * m) - ans << endl;
  return 0;
}
