#include <bits/stdc++.h>
using namespace std;
const int inf = 1e7 + 9;
int m, n, best;
int nei[5][2] = {{0, 0}, {1, 0}, {-1, 0}, {0, -1}, {0, 1}};
int a[40][40] = {0};
void search(int layer) {
  int xx, yy, i, j, x1, x2, y1, y2;
  vector<pair<int, int> > temp;
  bool fin = false;
  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++)
      if (a[i][j] == 0) {
        fin = true;
        break;
      }
    if (fin) break;
  }
  if (!fin) {
    best = layer;
    return;
  }
  if (layer + 1 >= best) return;
  xx = i, yy = j;
  for (int k = 0; k < 5; k++) {
    x2 = xx + nei[k][0];
    y2 = yy + nei[k][1];
    if (x2 >= 0 && y2 >= 0 && x2 < m && y2 < n) {
      temp.clear();
      for (i = 0; i < 5; i++) {
        x1 = x2 + nei[i][0];
        y1 = y2 + nei[i][1];
        if (x1 >= 0 && y1 >= 0 && x1 < m && y1 < n && a[x1][y1] == 0) {
          temp.push_back(make_pair(x1, y1));
          a[x1][y1] = 1;
        }
      }
      search(layer + 1);
      for (int i = 0; i < temp.size(); i++)
        a[temp[i].first][temp[i].second] = 0;
    }
  }
}
int main() {
  cin >> m >> n;
  best = m * n;
  search(0);
  cout << m * n - best << endl;
  return 0;
}
