#include <bits/stdc++.h>
using namespace std;
int all;
int n, m;
int dp[44][(1 << 6)][(1 << 6)][(1 << 6)];
int memo(int rem, int mask1, int mask2, int mask3) {
  if (rem == 0) return 0;
  if (dp[rem][mask1][mask2][mask3] != -1) return dp[rem][mask1][mask2][mask3];
  if (all == mask1) {
    return dp[rem][mask1][mask2][mask3] = memo(rem - 1, mask2, mask3, 0);
  }
  int res = 1e9;
  for (int i = 0; i < n; i++) {
    if ((mask1 & (1 << i)) == 0) {
      if (i - 1 >= 0) {
        int j = i - 1;
        int m1 = mask1;
        m1 |= (1 << j);
        if (j - 1 >= 0) m1 |= (1 << (j - 1));
        if (j + 1 < n) m1 |= (1 << (j + 1));
        int m2 = mask2;
        m2 |= (1 << j);
        res = min(res, 1 + memo(rem, m1, m2, mask3));
      }
      if (i + 1 < n) {
        int j = i + 1;
        int m1 = mask1;
        m1 |= (1 << j);
        if (j - 1 >= 0) m1 |= (1 << (j - 1));
        if (j + 1 < n) m1 |= (1 << (j + 1));
        int m2 = mask2;
        m2 |= (1 << j);
        res = min(res, 1 + memo(rem, m1, m2, mask3));
      }
      int j = i;
      int m2 = mask2;
      m2 |= (1 << j);
      if (j - 1 >= 0) m2 |= (1 << (j - 1));
      if (j + 1 < n) m2 |= (1 << (j + 1));
      int m1 = mask1;
      m1 |= (1 << j);
      int m3 = mask3;
      m3 |= (1 << j);
      res = min(res, 1 + memo(rem, m1, m2, m3));
      j = i;
      m1 = mask1;
      m1 |= (1 << j);
      if (j - 1 >= 0) m1 |= (1 << (j - 1));
      if (j + 1 < n) m1 |= (1 << (j + 1));
      m2 = mask2;
      m2 |= (1 << j);
      res = min(res, 1 + memo(rem, m1, m2, mask3));
    }
  }
  return dp[rem][mask1][mask2][mask3] = res;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  if (m < n) swap(n, m);
  all = (1 << n) - 1;
  memset(dp, -1, sizeof dp);
  cout << n * m - memo(m, 0, 0, 0) << '\n';
  return 0;
}
