#include <bits/stdc++.h>
using namespace std;
struct State {
  int n, a, b, c;
  State(int a, int b, int c, int d) : n(a), a(b), b(c), c(d) {}
};
bool operator<(State a, State b) {
  if (a.n != b.n) return a.n < b.n;
  if (a.a != b.a) return a.a < b.a;
  if (a.b != b.b) return a.b < b.b;
  return a.c < b.c;
}
const int MAX = 1 << 7;
const int max_n = 50;
int h, w;
map<State, int> mp;
int f(int x, int y) {
  int z = x ^ y;
  return x & z;
}
int get(int x) {
  int ret = 0;
  while (x) {
    if (x & 1) {
      ret++;
      x >>= 3;
    } else
      x >>= 1;
  }
  return ret;
}
int cal(int k, int a, int b, int c) {
  if (k == -2) return get(c);
  if (a == b && a == c && a == 0 && k == 0) return 0;
  if (mp.count(State(k, a, b, c))) return mp[State(k, a, b, c)];
  int d = (1 << h) - 1;
  if (c == 0) return mp[State(k, a, b, c)] = cal(k - 1, d, a, b);
  int t = c, ret = 1000;
  for (int i = 0; t; i++, t >>= 1) {
    if (t & 1) {
      ret = min(ret,
                1 + cal(k, a, f(b, 1 << i), f(c, (1 << i) + (1 << (i + 1)))));
      if (i != 0)
        ret = min(ret, 1 + cal(k, a, f(b, 1 << (i - 1)), f(c, 1 << i)));
      ret = min(ret, 1 + cal(k, a, f(b, 1 << (i + 1)),
                             f(c, (1 << i) + (1 << (i + 1)) + (1 << (i + 2)))));
      if (i > 0)
        ret = min(ret, 1 + cal(k, f(a, 1 << i),
                               f(b, (1 << i) + (1 << (i - 1)) + (1 << (i + 1))),
                               f(c, 1 << i)));
      else
        ret = min(ret, 1 + cal(k, f(a, 1 << i), f(b, (1 << i) + (1 << (i + 1))),
                               f(c, 1 << i)));
      break;
    }
  }
  return mp[State(k, a, b, c)] = ret;
}
int main() {
  scanf("%d%d", &h, &w);
  if (h > w) swap(h, w);
  printf("%d\n", h * w - cal(w, 0, 0, 0));
  return 0;
}
