#include <bits/stdc++.h>
using namespace std;
const int MOD(1000000007);
const int INF((1 << 30) - 1);
const int MAXN();
int n, m, num[(1 << 14) + 5], dp[45][(1 << 14) + 5];
bool ok(int mask1, int mask2) {
  for (int j = 0; j < m; j++) {
    if ((1 << j) & mask1) continue;
    if (j - 1 >= 0 && ((1 << (j - 1)) & mask1))
      ;
    else if (j + 1 < m && ((1 << (j + 1)) & mask1))
      ;
    else if ((1 << (j + m)) & mask1)
      ;
    else if ((1 << j) & mask2)
      ;
    else
      return false;
  }
  return true;
}
int main() {
  for (int i = 0; i < 1 << 14; i++)
    for (int j = i; j; j -= j & (-j)) num[i]++;
  scanf("%d%d", &n, &m);
  if (n < m) swap(n, m);
  memset(dp, -1, sizeof(dp));
  for (int j = 0; j < 1 << m; j++) dp[0][j] = m - num[j];
  for (int i = 1; i <= n - 1; i++)
    for (int j = 0; j < 1 << (2 * m); j++) {
      if (dp[i - 1][j] == -1) continue;
      for (int k = 0; k < 1 << m; k++)
        if (ok(j, k))
          dp[i][k + j % (1 << m) * (1 << m)] = max(
              dp[i][k + j % (1 << m) * (1 << m)], dp[i - 1][j] + m - num[k]);
    }
  int ans = 0;
  for (int j = 0; j < 1 << (2 * m); j++)
    if (ok(j, 0)) ans = max(ans, dp[n - 1][j]);
  printf("%d", ans);
}
