#include <bits/stdc++.h>
using namespace std;
int dp[41][(1 << 6)][(1 << 6)];
int m, n;
bool check(int x, int y, int z) {
  for (int i = 0; i < n; i++) {
    if (y & (1 << i)) continue;
    if (i > 0 && (y & (1 << (i - 1)))) continue;
    if ((i < n - 1) && (y & (1 << (i + 1)))) continue;
    if ((x & (1 << i)) || (z & (1 << i))) continue;
    return false;
  }
  return true;
}
int fun(int x) {
  int ret = 0;
  while (x) {
    if (x % 2) ret++;
    x /= 2;
  }
  return ret;
}
int main() {
  cin >> m >> n;
  if (n > m) swap(m, n);
  int MAX = (1 << n);
  for (int i = 0; i < m; i++)
    for (int j = 0; j < MAX; j++)
      for (int k = 0; k < MAX; k++) dp[i][j][k] = 100;
  for (int i = 0; i < MAX; i++) {
    int ct = fun(i);
    dp[0][i][0] = ct;
  }
  if (n == 1) {
    cout << m - (m + 2) / 3 << endl;
    return 0;
  }
  for (int i = 1; i < m - 1; i++) {
    for (int j = 0; j < MAX; j++) {
      int ct = fun(j);
      for (int k = 0; k < MAX; k++)
        for (int l = 0; l < MAX; l++)
          if (check(j, k, l)) {
            dp[i][j][k] = min(dp[i][j][k], dp[i - 1][k][l] + ct);
          }
    }
  }
  int ans = 100;
  for (int j = 0; j < MAX; j++) {
    int ct = fun(j);
    for (int k = 0; k < MAX; k++)
      for (int l = 0; l < MAX; l++)
        if (check(j, k, l) && check(0, j, k)) {
          dp[m - 1][j][k] = min(dp[m - 1][j][k], dp[m - 2][k][l] + ct);
          ans = min(ans, dp[m - 1][j][k]);
        }
  }
  cout << m * n - ans << endl;
}
