#include <bits/stdc++.h>
using namespace std;
void read(long long &x) {
  x = 0;
  long long f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -f;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 1) + (x << 3) + c - '0';
    c = getchar();
  }
  x *= f;
  return;
}
long long fs(long long x) { return x < 0 ? -x : x; }
void print(long long x) {
  if (x < 10) {
    putchar(x + '0');
    return;
  }
  print(x / 10);
  putchar(x % 10 + '0');
  return;
}
void write(long long x) {
  if (x < 0) {
    putchar('-');
    x = fs(x);
  }
  print(x);
  return;
}
long long mint(long long x, long long y) { return x < y ? x : y; }
long long maxt(long long x, long long y) { return x > y ? x : y; }
long long n, m;
long long dp[45][128][128];
int main() {
  read(n), read(m);
  if (n < m) swap(n, m);
  long long ans = 0x3f3f3f3f3f3f3f;
  memset(dp, 0x3f, sizeof(dp));
  for (int p = 0; p < (1 << m); p++) {
    dp[1][p][0] = 0;
    for (int k = 0; k < m; k++)
      if (p & (1 << k)) dp[1][p][0]++;
    if (n == 1) {
      bool flag = 0;
      for (int k = 0; k < m; k++)
        if (!(p & (1 << k) || (k > 0 && p & (1 << k - 1)) ||
              (k < m - 1 && p & (1 << k + 1))))
          flag = 1;
      if (!flag) ans = mint(ans, dp[1][p][0]);
    }
  }
  for (int i = 2; i <= n; i++)
    for (int k3 = 0; k3 < (1 << m); k3++)
      for (int k2 = 0; k2 < (1 << m); k2++) {
        for (int k1 = 0; k1 < (1 << m); k1++) {
          long long tmp = 0;
          for (int k = 0; k < m; k++)
            if (k1 & (1 << k)) tmp++;
          bool f = 0;
          for (int k = 0; k < m; k++)
            if (!(k1 & (1 << k) || k2 & (1 << k) || k3 & (1 << k) ||
                  (k > 0 && (k2 & (1 << k - 1))) ||
                  (k < m - 1 && (k2 & (1 << k + 1))))) {
              f = 1;
              break;
            }
          if (!f)
            dp[i][k1][k2] = mint(dp[i][k1][k2], dp[i - 1][k2][k3] + tmp);
          else
            continue;
          if (i == n) {
            bool flag = 0;
            for (int k = 0; k < m; k++)
              if (!(k1 & (1 << k) || k2 & (1 << k) ||
                    (k > 0 && (k1 & (1 << k - 1))) ||
                    (k < m - 1 && (k1 & (1 << k + 1))))) {
                flag = 1;
                break;
              }
            if (!flag) ans = mint(ans, dp[i][k1][k2]);
          }
        }
      }
  printf("%lld", n * m - ans);
}
