#include <bits/stdc++.h>
using namespace std;
int dp[45][1 << 6][1 << 6];
int n, m, z[1 << 6];
int can(int a, int b, int c) {
  int x = a | b | (b << 1) | (b >> 1) | c;
  return (x & ((1 << m) - 1)) == (1 << m) - 1;
}
int main() {
  cin >> n >> m;
  if (n < m) swap(n, m);
  for (int i = 0; i < (1 << m); i++) z[i] = m - __builtin_popcount(i);
  memset(dp, -1, sizeof(dp));
  for (int i = 0; i < (1 << 6); i++) dp[0][0][i] = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < (1 << m); j++)
      for (int k = 0; k < (1 << m); k++)
        if (dp[i][j][k] != -1)
          for (int l = 0; l < (1 << m); l++)
            if (can(j, k, l))
              dp[i + 1][k][l] = max(dp[i + 1][k][l], dp[i][j][k] + z[k]);
  int ans = 0;
  for (int i = 0; i < (1 << m); i++) ans = max(ans, dp[n][i][0]);
  cout << ans << endl;
}
