#include <bits/stdc++.h>
using namespace std;
short memo[6][40][1 << 6][1 << 6][1 << 6];
int n, m;
short roll(int row, int col, int a, int b, int c) {
  if (col == m) {
    return (n - __builtin_popcount(a));
  }
  if (row == n) {
    return roll(0, col + 1, b, c, 0) +
           (col > 0 ? (n - __builtin_popcount(a)) : 0);
  }
  short &ans = memo[row][col][a][b][c];
  if (~ans) {
    return ans;
  }
  ans = roll(row + 1, col, a, b | (1 << row), c);
  if (col > 0) {
    ans = max(ans, roll(row + 1, col, a | (1 << row), b, c));
  }
  if (col < m - 1) {
    ans = max(ans, roll(row + 1, col, a, b, c | (1 << row)));
  }
  if (row > 0) {
    ans = max(ans, roll(row + 1, col, a, b | (1 << (row - 1)), c));
  }
  if (row < n - 1) {
    ans = max(ans, roll(row + 1, col, a, b | (1 << (row + 1)), c));
  }
  return ans;
}
int main() {
  scanf("%d %d", &n, &m);
  if (n > m) {
    swap(n, m);
  }
  memset(memo, -1, sizeof memo);
  cout << roll(0, 0, 0, 0, 0) << '\n';
  return 0;
}
