#include <bits/stdc++.h>
using namespace std;
int f[45][1000];
int n, m;
int nn;
int id, nows;
int a[20];
int g[10];
void dfs(int i, int s, int cnt) {
  if (i == m) {
    if (f[id + 1][s] == -1 || f[id][nows] + cnt < f[id + 1][s]) {
      f[id + 1][s] = f[id][nows] + cnt;
    }
    return;
  }
  if (a[i] == 0) {
    if (i > 0 && s / g[i - 1] == 0) {
      dfs(i + 1, s + g[i] * 2 + g[i - 1], cnt + 1);
      if (i + 1 < m && a[i + 1] != 0)
        dfs(i + 2, s + g[i] * 2 + g[i + 1] + g[i - 1], cnt + 1);
    } else {
      dfs(i + 1, s + g[i] * 2, cnt + 1);
      if (i + 1 < m && a[i + 1] != 0)
        dfs(i + 2, s + g[i] * 2 + g[i + 1], cnt + 1);
    }
  }
  if (a[i] == 1) {
    if (i > 0 && s / g[i - 1] == 0) {
      dfs(i + 1, s + g[i] * 2 + g[i - 1], cnt + 1);
      if (i + 1 < m && a[i + 1] != 0)
        dfs(i + 2, s + g[i] * 2 + g[i + 1] + g[i - 1], cnt + 1);
    } else {
      dfs(i + 1, s + g[i] * 2, cnt + 1);
      if (i + 1 < m && a[i + 1] != 0)
        dfs(i + 2, s + g[i] * 2 + g[i + 1], cnt + 1);
    }
    dfs(i + 1, s, cnt);
  }
  if (a[i] == 2) {
    if (i > 0 && s / g[i - 1] == 0) {
      dfs(i + 1, s + g[i] * 2 + g[i - 1], cnt + 1);
      if (i + 1 < m && a[i + 1] != 0)
        dfs(i + 2, s + g[i] * 2 + g[i + 1] + g[i - 1], cnt + 1);
    } else {
      dfs(i + 1, s + g[i] * 2, cnt + 1);
      if (i + 1 < m && a[i + 1] != 0)
        dfs(i + 2, s + g[i] * 2 + g[i + 1], cnt + 1);
    }
    dfs(i + 1, s + g[i], cnt);
  }
}
int main() {
  int i, j, k;
  int kk;
  int ans;
  g[0] = 1;
  for (i = 1; i <= 10; i++) {
    g[i] = g[i - 1] * 3;
  }
  while (scanf("%d%d", &n, &m) != EOF) {
    if (n < m) swap(n, m);
    nn = 1;
    k = 0;
    for (i = 0; i < m; i++) {
      nn *= 3;
      k += g[i];
    }
    memset(f, -1, sizeof(f));
    f[0][k] = 0;
    for (i = 0; i < n; i++) {
      id = i;
      for (j = 0; j < nn; j++) {
        if (f[id][j] == -1) continue;
        for (k = 0; k < m; k++) a[k] = 0;
        k = j;
        kk = 0;
        while (k) {
          a[kk++] = k % 3;
          k /= 3;
        }
        nows = j;
        dfs(0, 0, 0);
      }
    }
    ans = n * m;
    for (i = 0; i < nn; i++) {
      if (f[n][i] == -1) continue;
      kk = 0;
      for (k = 0; k < m; k++) a[k] = 0;
      k = i;
      while (k) {
        a[kk++] = k % 3;
        k /= 3;
      }
      for (k = 0; k < m; k++) {
        if (a[k] == 0) break;
      }
      if (k >= m) ans = min(ans, f[n][i]);
    }
    printf("%d\n", n * m - ans);
  }
  return 0;
}
