#include <bits/stdc++.h>
using namespace std;
struct Node {
  int U, D, L, R;
  int num;
  int x, y;
} node[100 * 100];
int n, m, top;
int re;
int dir[5][2] = {{0, 0}, {0, 1}, {1, 0}, {-1, 0}, {0, -1}};
void CoverCol(int c) {
  int i;
  for (i = node[c].D; i != c; i = node[i].D) {
    node[node[i].L].R = node[i].R;
    node[node[i].R].L = node[i].L;
    node[node[i].y].num--;
  }
}
void Resume(int c) {
  int i;
  for (i = node[c].U; i != c; i = node[i].U) {
    node[node[i].R].L = i;
    node[node[i].L].R = i;
    node[node[i].y].num++;
  }
}
int judge() {
  int hash[100] = {0};
  int ans = 0, i, j, k;
  for (i = node[0].R; i; i = node[i].R)
    if (!hash[i]) {
      ans++;
      hash[i] = 1;
      for (j = node[i].D; j != i; j = node[j].D)
        for (k = node[j].R; k != j; k = node[k].R) hash[node[k].y] = 1;
    }
  return ans;
}
void dfs(int k) {
  int min = INT_MAX, c, i, j;
  if (k + judge() > re) return;
  if (node[0].R == 0) {
    if (k < re) re = k;
    return;
  }
  for (i = node[0].R; i; i = node[i].R) {
    if (node[i].num < min) {
      min = node[i].num;
      c = i;
      if (min == 1) break;
    }
  }
  for (i = node[c].D; i != c; i = node[i].D) {
    CoverCol(i);
    for (j = node[i].R; j != i; j = node[j].R) CoverCol(j);
    dfs(k + 1);
    for (j = node[j].L; j != i; j = node[j].L) Resume(j);
    Resume(i);
  }
}
int main() {
  int i, j, k, a, b, now, x1, y1, x2, y2, pos, pre, start, t, r, c, id1, id2;
  while (scanf("%d%d", &r, &c) != EOF) {
    bool ok = true;
    m = r * c;
    for (i = 0; i <= m; i++) {
      node[i].U = node[i].D = i;
      node[i].y = i;
      node[i].x = 0;
      node[i].L = i - 1;
      node[i].R = i + 1;
      node[i].num = 0;
    }
    node[0].L = m;
    node[m].R = 0;
    now = m + 1;
    for (i = 1; i <= r; i++)
      for (j = 1; j <= c; j++) {
        x1 = i;
        y1 = j;
        id1 = (x1 - 1) * c + y1;
        pre = now;
        start = now;
        for (k = 0; k < 5; k++) {
          x2 = dir[k][0] + x1;
          y2 = dir[k][1] + y1;
          if (x2 >= 1 && x2 <= r && y2 >= 1 && y2 <= c) {
            id2 = (x2 - 1) * c + y2;
            b = id2;
            node[now].y = b;
            node[b].num++;
            node[now].U = node[b].U;
            node[now].D = b;
            node[node[b].U].D = now;
            node[b].U = now;
            node[now].L = pre;
            node[now].R = start;
            node[pre].R = now;
            node[start].L = now;
            pre = now++;
          }
        }
      }
    re = INT_MAX;
    dfs(0);
    printf("%d\n", r * c - re);
  }
  return 0;
}
