#include <bits/stdc++.h>
using namespace std;
int n, m;
int visit[40][40];
int ans = 1e9;
int d1[5] = {0, 1, 0, -1, 0}, d2[5] = {1, 0, -1, 0, 0};
int use;
bool chk(int a) {
  for (int i = 0; i < m; i++)
    if (!visit[a][i]) return false;
  return true;
}
inline void dfs(int a, int b, int dis) {
  if (ans == use) return;
  if (dis == use) {
    if (chk(n - 1) && (n == 1 || chk(n - 2))) ans = min(ans, dis);
    return;
  }
  if (b >= m && a >= 1)
    if (!chk(a - 1)) return;
  if (b >= m) a++, b = 0;
  if (a == n) return;
  vector<pair<int, int> > vi;
  for (int i = 0; i < 5; i++) {
    if (a + d1[i] < 0 || a + d1[i] >= n || b + d2[i] < 0 || b + d2[i] >= m)
      continue;
    if (visit[a + d1[i]][b + d2[i]] == 0)
      vi.push_back(make_pair(a + d1[i], b + d2[i])),
          visit[a + d1[i]][b + d2[i]] = 1;
  }
  dfs(a, b + 1, dis + 1);
  for (int i = 0; i < vi.size(); i++) visit[vi[i].first][vi[i].second] = 0;
  dfs(a, b + 1, dis);
}
int main() {
  cin >> n >> m;
  if (n < m) swap(n, m);
  int left = 1, right = n * m;
  while (left <= right) {
    use = (left + right) / 2;
    dfs(0, 0, 0);
    if (ans == use)
      right = use - 1;
    else
      left = use + 1;
  }
  cout << n * m - ans << endl;
  return 0;
}
