#include <bits/stdc++.h>
using namespace std;
template <class Ty, class Tx>
Ty cast(const Tx &x) {
  Ty y;
  stringstream ss("");
  ss << x;
  ss.seekg(0);
  ss >> y;
  return y;
}
int memo[42][1 << 6][1 << 6][1 << 6];
bool seen[42][1 << 6][1 << 6][1 << 6];
int n, m;
int swch(int pos, int pmask, int cmask, int nmask);
int doit(int pos, int pmask, int cmask, int nmask) {
  int row = pos / m;
  int col = pos % m;
  if (row >= n) return 0;
  int &ret = memo[pos][pmask][cmask][nmask];
  if (seen[pos][pmask][cmask][nmask]) return ret;
  seen[pos][pmask][cmask][nmask] = true;
  ret = -10000000;
  if ((cmask >> col) & 1) return ret = swch(pos + 1, pmask, cmask, nmask);
  if ((pmask >> col) & 1) return ret = 1 + swch(pos + 1, pmask, cmask, nmask);
  ret = max(ret, swch(pos + 1, pmask, cmask | (1 << col), nmask));
  if (row < n - 1)
    ret = max(ret, 1 + swch(pos + 1, pmask, cmask, nmask | (1 << col)));
  if (col < m - 1)
    ret = max(ret, 1 + swch(pos + 1, pmask, cmask | (1 << (col + 1)), nmask));
  if (col > 0 && ((cmask >> (col - 1)) & 1))
    ret = max(ret, 1 + swch(pos + 1, pmask, cmask, nmask));
  return ret;
}
int swch(int pos, int pmask, int cmask, int nmask) {
  int row = pos / m;
  int col = pos % m;
  if (row < n && col == 0) {
    pmask = cmask;
    cmask = nmask;
    nmask = 0;
  }
  return doit(pos, pmask, cmask, nmask);
}
int main() {
  cin >> n >> m;
  if (m > n) swap(n, m);
  cout << doit(0, 0, 0, 0) << endl;
  return 0;
}
