#include <bits/stdc++.h>
int f[42][65][65], v[65];
int n, m;
void dfs(int i, int j, int k, int now, int a, int b, int c) {
  if (now > n)
    f[i + 1][b][c] =
        ((f[i + 1][b][c]) > (f[i][j][k] + n - v[a]) ? (f[i + 1][b][c])
                                                    : (f[i][j][k] + n - v[a]));
  else {
    if (i > 1) dfs(i, j, k, now + 1, a | (1 << now - 1), b, c);
    dfs(i, j, k, now + 1, a, b | (1 << now - 1), c);
    if (i < m) dfs(i, j, k, now + 1, a, b, c | (1 << now - 1));
    if (now > 1) dfs(i, j, k, now + 1, a, b | (1 << now - 2), c);
    if (now < n) dfs(i, j, k, now + 1, a, b | (1 << now), c);
  }
}
int main() {
  int i, j, k, s = 0;
  scanf("%d%d", &n, &m);
  if (n > m) {
    n ^= m;
    m ^= n;
    n ^= m;
  }
  for (i = 1; i <= 1 << n; i++) v[i] = v[i - ((i) & (-(i)))] + 1;
  for (i = 1; i <= m + 1; i++)
    for (j = 0; j < 1 << n; j++)
      for (k = 0; k < 1 << n; k++) f[i][j][k] = -1000000000;
  f[1][0][0] = 0;
  for (i = 1; i <= m; i++)
    for (j = 0; j < 1 << n; j++)
      for (k = 0; k < 1 << n; k++)
        if (f[i][j][k] >= 0) dfs(i, j, k, 1, j, k, 0);
  for (i = 0; i < 1 << n; i++)
    s = ((s) > (f[m + 1][i][0] - v[i]) ? (s) : (f[m + 1][i][0] - v[i]));
  printf("%d\n", s);
  return 0;
}
