#include <bits/stdc++.h>
using namespace std;
bool had[45][45];
int lea;
pair<int, int> la[45][45];
int dx[5] = {1, 0, 0, 0, -1}, dy[5] = {0, 1, -1, 0, 0};
inline int mi(const int &x, const int &y) { return (x > y) ? y : x; }
int n, m;
void dfs(const int &chan, const int &dep) {
  bool flag = 0;
  int i, j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      if (had[i][j]) {
        flag = 1;
        break;
      }
    }
    if (flag) break;
  }
  if (!flag) {
    lea = mi(lea, chan);
    return;
  }
  if (chan + mi((dep / 4), 1) >= lea) return;
  vector<int> tmp[2];
  for (int k = 0; k < 5; k++) {
    int x = i + dx[k], y = j + dy[k];
    if (x >= 0 && x < n && y >= 0 && y < m) {
      int cnt = 0;
      for (int l = 0; l < 5; l++) {
        int xx = x + dx[l], yy = y + dy[l];
        if (xx >= 0 && xx < n && yy >= 0 && yy < m && had[xx][yy]) {
          cnt++;
          had[xx][yy] = 0;
          tmp[0].push_back(xx);
          tmp[1].push_back(yy);
        }
      }
      dfs(chan + 1, dep - cnt);
      for (int l = 0; l < tmp[0].size(); l++) {
        had[tmp[0][l]][tmp[1][l]] = 1;
      }
    }
  }
}
int main() {
  cin >> n >> m;
  if (n < m) swap(n, m);
  lea = mi(((n + 2) / 3) * (((m + 1) >> 1) << 1), ((n + 1) >> 1) * m);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      had[i][j] = 1;
    }
  }
  dfs(0, n * m);
  cout << n * m - lea;
  return 0;
}
