#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 16;
int n, m;
int d[2][N];
int get_n(int x, int n) {
  int tmp = 3 << (n * 2);
  tmp = x & tmp;
  tmp >>= n * 2;
  return tmp;
}
int set_n(int x, int n, int y) {
  int tmp = 3 << (n * 2);
  x = x & (~tmp);
  y <<= (n * 2);
  x |= y;
  return x;
}
void update(int &x, int y) {
  if (x == -1 || x < y) x = y;
}
int solve() {
  int i, j, k;
  int t = 0;
  memset(d, -1, sizeof(d));
  d[0][0] = 0;
  int tot = 1 << (n * 2 + 2);
  for (i = 0; i < m; ++i) {
    for (j = 0; j < n; ++j) {
      memset(d[1 - t], -1, sizeof(d[1 - t]));
      for (k = 0; k < tot; ++k) {
        if (d[t][k] == -1) continue;
        int t0 = get_n(k, j);
        int t1 = get_n(k, j + 1);
        int st = set_n(k, j, 1);
        st = set_n(st, j + 1, 1);
        update(d[1 - t][st], d[t][k]);
        if (t0 > 0) {
          st = set_n(k, j - 1, 2);
          st = set_n(st, j, 0);
          st = set_n(st, j + 1, 0);
          update(d[1 - t][st], d[t][k] + 1);
          if (t0 == 1) {
            st = set_n(k, j - 1, 0);
            st = set_n(st, j, 2);
            st = set_n(st, j + 1, 2);
            update(d[1 - t][st], d[t][k] + 1);
          }
        }
        if (t1 > 0) {
          st = set_n(k, j, 0);
          st = set_n(st, j + 1, 0);
          update(d[1 - t][st], d[t][k] + 1);
          if (t1 == 1) {
            st = set_n(k, j, 2);
            st = set_n(st, j + 1, 2);
            update(d[1 - t][st], d[t][k] + 1);
          }
        }
        if (t0 == 1 && t1 == 1) {
          st = set_n(k, j - 1, 0);
          st = set_n(st, j, 2);
          st = set_n(st, j + 1, 2);
          update(d[1 - t][st], d[t][k] + 2);
        }
      }
      t = 1 - t;
    }
    memset(d[1 - t], -1, sizeof(d[1 - t]));
    for (k = 0; k < tot; ++k) {
      int st = set_n(k, n, 0);
      st <<= 2;
      update(d[1 - t][st], d[t][k]);
    }
    t = 1 - t;
  }
  int ans = -1;
  for (k = 0; k < tot; ++k) {
    update(ans, d[t][k]);
  }
  return ans;
}
int main() {
  int i, j, k, t, nc = 0;
  while (scanf("%d%d", &n, &m) != EOF) {
    if (n > m) swap(n, m);
    int ans = solve();
    printf("%d\n", ans);
  }
  return 0;
}
