#include <bits/stdc++.h>
using namespace std;
int n, m;
int dp[50][1100][1100];
bool check(int x, int y) {
  int i;
  for (i = 0; i < m; i++) {
    if (!((1 << i) & x) && !((1 << (i + 1)) & x)) {
      if (i == 0 || ((1 << (i - 1)) & x) == 0) {
        if (((1 << i) & y) == 0) return false;
      }
    }
  }
  return true;
}
int kong(int x) {
  int i;
  int re = 0;
  for (i = 0; i < m; i++) {
    if (((1 << i) & x) == 0) re++;
  }
  return re;
}
bool ok(int x, int y, int z) {
  int i;
  for (i = 0; i < m; i++) {
    if (((1 << i) & y) == 0 && ((1 << (i + 1)) & y) == 0) {
      if (i == 0 || ((1 << (i - 1)) & y) == 0) {
        if (((1 << i) & x) == 0 && ((1 << i) & z) == 0) return false;
      }
    }
  }
  return true;
}
int main() {
  int i, j, k, e;
  scanf("%d%d", &n, &m);
  if (n == 1 && m == 1) {
    puts("0");
    return 0;
  }
  if (m > n) swap(n, m);
  for (i = 0; i < (1 << m); i++) {
    for (j = 0; j < (1 << m); j++) {
      if (check(i, j))
        dp[1][i][j] = kong(i);
      else
        dp[1][i][j] = -0x3fffffff;
    }
  }
  for (i = 2; i < n; i++) {
    for (j = 0; j < (1 << m); j++) {
      for (k = 0; k < (1 << m); k++) {
        for (e = 0; e < (1 << m); e++) {
          if (dp[i - 1][e][j] == -0x3fffffff) continue;
          if (ok(e, j, k)) {
            dp[i][j][k] = max(dp[i][j][k], dp[i - 1][e][j] + kong(j));
          }
        }
      }
    }
  }
  int ans = -0x3fffffff;
  for (i = 0; i < (1 << m); i++) {
    for (j = 0; j < (1 << m); j++) {
      if (check(j, i)) {
        ans = max(ans, dp[n - 1][i][j] + kong(j));
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
