#include <bits/stdc++.h>
using namespace std;
const int spid[5][2] = {{0, 0}, {1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int a[50][50];
int n, m, best;
void search(int x) {
  vector<pair<int, int> > tmp;
  int i, j, xx, yy, x2, y2, x1, y1, flag1 = 0;
  for (i = 0; i < m; ++i) {
    for (j = 0; j < n; ++j) {
      if (a[i][j] == 0) {
        flag1 = 1;
        break;
      }
    }
    if (flag1 == 1) {
      break;
    }
  }
  if (flag1 == 0) {
    best = x;
    return;
  }
  if (x + 1 >= best) {
    return;
  }
  xx = i;
  yy = j;
  for (int k = 0; k < 5; ++k) {
    x1 = xx + spid[k][0];
    y1 = yy + spid[k][1];
    if (x1 >= 0 && x1 < m && y1 >= 0 && y1 < n) {
      tmp.clear();
      for (i = 0; i < 5; ++i) {
        x2 = x1 + spid[i][0];
        y2 = y1 + spid[i][1];
        if (x2 >= 0 && x2 < m && y2 >= 0 && y2 < n && a[x2][y2] == 0) {
          tmp.push_back(make_pair(x2, y2));
          a[x2][y2] = 1;
        }
      }
      search(x + 1);
      for (i = 0; i < tmp.size(); ++i) {
        a[tmp[i].first][tmp[i].second] = 0;
      }
    }
  }
}
int main(int argc, char const *argv[]) {
  cin >> m >> n;
  memset(a, 0, sizeof(a));
  best = m * n;
  search(0);
  printf("%d\n", m * n - best);
  return 0;
}
