#include <bits/stdc++.h>
using namespace std;
int best, n, m;
int neibour[5][2] = {{0, 0}, {0, -1}, {0, 1}, {1, 0}, {-1, 0}};
int a[50][50];
void search(int h) {
  int i, j, t = 0, x1, x2, y1, y2;
  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) {
      if (a[i][j] == 0) {
        t = 1;
        break;
      }
    }
    if (t == 1) break;
  }
  if (t == 0) {
    best = h;
    return;
  }
  if (h + 1 >= best) return;
  vector<pair<int, int> > tmp;
  int x = i, y = j;
  for (int k = 0; k < 5; k++) {
    x1 = x + neibour[k][0];
    y1 = y + neibour[k][1];
    if (x1 >= 0 && x1 < m && y1 >= 0 && y1 < n) {
      tmp.clear();
      for (int b = 0; b < 5; b++) {
        x2 = x1 + neibour[b][0];
        y2 = y1 + neibour[b][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(h + 1);
      for (int p = 0; p < tmp.size(); p++) {
        a[tmp[p].first][tmp[p].second] = 0;
      }
    }
  }
}
int main() {
  cin >> n >> m;
  memset(a, 0, sizeof(a));
  best = n * m;
  search(0);
  cout << n * m - best;
}
