#include <bits/stdc++.h>
int n, m, d[50][8][5100];
int dp(int x, int y, int st) {
  int nex = x, ney = y + 1;
  if (d[x][y][st] != -1) return d[x][y][st];
  if (x == n) return d[x][y][st] = 0;
  if (ney == m) {
    ney = 0;
    nex++;
  }
  int idx, i, j, s[8];
  for (i = 0; i < m; ++i) s[i] = (st >> (2 * i)) & 3;
  if ((y != 0 && s[y - 1] == 2) || (x != 0 && s[y] == 3)) {
    idx = 0;
    for (i = m - 1; i >= 0; --i) {
      if (i != y)
        idx = (idx << 2) | s[i];
      else
        idx = (idx << 2) | 1;
    }
    return d[x][y][st] = dp(nex, ney, idx);
  }
  if ((y != 0 && s[y - 1] == 1) || (x != 0 && s[y] == 1)) {
    idx = 0;
    for (i = m - 1; i >= 0; --i) {
      if (i != y)
        idx = (idx << 2) | s[i];
      else
        idx = (idx << 2) | 0;
    }
    return d[x][y][st] = 1 + dp(nex, ney, idx);
  }
  int res = 0, tmp;
  for (j = 0; j < 5; ++j) {
    if (y == 0 && j == 4) continue;
    if (y == m - 1 && j == 2) continue;
    if (x == 0 && j == 1) continue;
    if (x == n - 1 && j == 3) continue;
    if (j == 0) {
      idx = 0;
      for (i = m - 1; i >= 0; --i) {
        if (i != y)
          idx = (idx << 2) | s[i];
        else
          idx = (idx << 2) | 1;
      }
      tmp = dp(nex, ney, idx);
      if (tmp > res) res = tmp;
    }
    if (j == 1) {
      if (s[y] != 1) {
        idx = 0;
        for (i = m - 1; i >= 0; --i) {
          if (i != y)
            idx = (idx << 2) | s[i];
          else
            idx = (idx << 2) | 0;
        }
        tmp = dp(nex, ney, idx);
        if (tmp > res) res = tmp;
      } else {
        idx = 0;
        for (i = m - 1; i >= 0; --i) {
          if (i != y)
            idx = (idx << 2) | s[i];
          else
            idx = (idx << 2) | 0;
        }
        tmp = 1 + dp(nex, ney, idx);
        if (tmp > res) res = tmp;
      }
    }
    if (j == 2) {
      idx = 0;
      for (i = m - 1; i >= 0; --i) {
        if (i != y)
          idx = (idx << 2) | s[i];
        else
          idx = (idx << 2) | 2;
      }
      tmp = 1 + dp(nex, ney, idx);
      if (tmp > res) res = tmp;
    }
    if (j == 3) {
      idx = 0;
      for (i = m - 1; i >= 0; --i) {
        if (i != y)
          idx = (idx << 2) | s[i];
        else
          idx = (idx << 2) | 3;
      }
      tmp = 1 + dp(nex, ney, idx);
      if (tmp > res) res = tmp;
    }
    if (j == 4) {
      if (s[y - 1] != 1) {
        idx = 0;
        for (i = m - 1; i >= 0; --i) {
          if (i != y)
            idx = (idx << 2) | s[i];
          else
            idx = (idx << 2) | 0;
        }
        tmp = dp(nex, ney, idx);
        if (tmp > res) res = tmp;
      } else {
        idx = 0;
        for (i = m - 1; i >= 0; --i) {
          if (i != y)
            idx = (idx << 2) | s[i];
          else
            idx = (idx << 2) | 0;
        }
        tmp = 1 + dp(nex, ney, idx);
        if (tmp > res) res = tmp;
      }
    }
  }
  return d[x][y][st] = res;
}
int main() {
  scanf("%d %d", &n, &m);
  if (n < m) {
    n = n ^ m;
    m = n ^ m;
    n = n ^ m;
  }
  memset(d, -1, sizeof(d));
  printf("%d\n", dp(0, 0, 0));
  return 0;
}
