#include <bits/stdc++.h>
using namespace std;
int dp[45][1 << 6][1 << 6];
int cost[1 << 6];
int n, m;
bool solve(int s1, int s2, int s3) {
  for (int i = 0; i < m; i++) {
    if (!(s2 & (1 << i))) {
      if (!(s1 & (1 << i)) && !(s3 & (1 << i)) &&
          !(i > 0 && (s2 & (1 << (i - 1)))) &&
          !(i < m - 1 && (s2 & (1 << (i + 1))))) {
        return false;
      }
    }
  }
  return true;
}
int main() {
  scanf("%d%d", &n, &m);
  if (n < m) swap(n, m);
  solve(0, 0, 3);
  for (int i = 0; i < 1 << m; i++) {
    cost[i] = 0;
    for (int j = 0; j < m; j++) {
      if (!(i & (1 << j))) {
        cost[i]++;
      }
    }
  }
  for (int i = 0; i < 1 << m; i++) {
    dp[1][i][0] = cost[i];
  }
  for (int i = 2; i <= n; i++) {
    for (int j = 0; j < 1 << m; j++) {
      for (int k = 0; k < 1 << m; k++) {
        dp[i][j][k] = 0;
        for (int s = 0; s < 1 << m; s++) {
          if (solve(j, k, s))
            dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][s] + cost[j]);
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < 1 << m; i++) {
    for (int j = 0; j < 1 << m; j++) {
      if (solve(0, i, j)) {
        ans = max(ans, dp[n][i][j]);
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
