#include <bits/stdc++.h>
using namespace std;
int n, m, d[45][1 << 7][1 << 7], cnt[1 << 7];
bool possible(int pmask, int mask, int nmask) {
  for (int i = 0; i < n; i++)
    if ((mask & (1 << i)) == 0 && (i == 0 || (mask & (1 << (i - 1))) == 0) &&
        (i == n - 1 || (mask & (1 << (i + 1))) == 0) &&
        (pmask & (1 << i)) == 0 && (nmask & (1 << i)) == 0)
      return false;
  return true;
}
int main() {
  cin >> n >> m;
  if (n > m) swap(n, m);
  for (int mask = 1; mask < (1 << n); mask++)
    cnt[mask] = cnt[mask >> 1] + ((mask & 1) > 0 ? 1 : 0);
  for (int mask = 1; mask < (1 << n); mask++)
    fill(d[0][mask], d[0][mask] + (1 << n), 1000 * 1000 * 1000);
  d[0][0][0] = 0;
  for (int i = 1; i <= m; i++)
    for (int mask = 0; mask < (1 << n); mask++)
      for (int nmask = 0; nmask < (1 << n); nmask++) {
        d[i][mask][nmask] = 1000 * 1000 * 1000;
        for (int pmask = 0; pmask < (1 << n); pmask++)
          if (possible(pmask, mask, nmask) &&
              d[i - 1][pmask][mask] < d[i][mask][nmask])
            d[i][mask][nmask] = d[i - 1][pmask][mask];
        d[i][mask][nmask] += cnt[mask];
      }
  int ans = 1000 * 1000 * 1000;
  for (int mask = 0; mask < (1 << n); mask++)
    if (d[m][mask][0] < ans) ans = d[m][mask][0];
  cout << n * m - ans << endl;
  return 0;
}
