#include <bits/stdc++.h>
using namespace std;
int dp[45][1 << 6][1 << 6], n, m;
int st[1 << 6];
int sttot;
inline int find0(int x) {
  int ans = 0;
  ans = m - __builtin_popcount(x);
  return ans;
}
bool check(int a, int b, int c) {
  int s = b | (b << 1) | (b >> 1) | a | c;
  return (s & (sttot - 1)) == (sttot - 1);
}
int main() {
  scanf("%d%d", &n, &m);
  if (n < m) swap(n, m);
  sttot = (1 << m);
  for (int i = 0; i < n + 1; ++i)
    for (int j = 0; j < sttot; ++j)
      for (int k = 0; k < sttot; ++k) dp[i][j][k] = -9999;
  for (int i = 0; i < sttot; ++i) dp[0][0][i] = 0, st[i] = find0(i);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < sttot; ++j)
      for (int k = 0; k < sttot; ++k)
        for (int l = 0; l < sttot; ++l) {
          if (check(j, k, l)) {
            dp[i + 1][k][l] = max(dp[i + 1][k][l], dp[i][j][k] + st[k]);
          }
        }
  int ans = 0;
  for (int i = 0; i < sttot; ++i) ans = max(ans, dp[n][i][0]);
  printf("%d\n", ans);
  return 0;
}
