#include <bits/stdc++.h>
using namespace std;
int cnt[41][100][100];
int main() {
  int n, m;
  while (cin >> n >> m) {
    if (n < m) {
      swap(n, m);
    }
    int mask = (1 << m) - 1;
    for (int i = 0; i < 41; i++) {
      for (int j = 0; j < 100; j++) {
        for (int k = 0; k < 100; k++) {
          cnt[i][j][k] = -1;
        }
      }
    }
    for (int spot = 0; spot < 1 << m; spot++) {
      int range = mask & ((spot << 1) | (spot >> 1) | spot);
      int undetermines = mask - range;
      cnt[0][spot][undetermines] = m - __builtin_popcount(spot);
    }
    for (int i = 0; i < n - 1; i++) {
      for (int spot = 0; spot < 1 << m; spot++) {
        for (int undetermines = 0; undetermines < 1 << m; undetermines++) {
          if (cnt[i][spot][undetermines] == -1) {
            continue;
          }
          for (int next_spot = 0; next_spot < 1 << m; next_spot++) {
            bool inconsistent = false;
            for (int j = 0; j < m; j++) {
              if ((((undetermines >> j) & 1) == 1) &&
                  (((next_spot >> j) & 1) == 0)) {
                inconsistent = true;
              }
            }
            if (inconsistent) {
              continue;
            }
            int next_undetermines =
                mask - int(mask & (((next_spot << 1) | (next_spot >> 1) |
                                    next_spot | spot)));
            cnt[i + 1][next_spot][next_undetermines] =
                max(cnt[i + 1][next_spot][next_undetermines],
                    cnt[i][spot][undetermines] +
                        (m - __builtin_popcount(next_spot)));
          }
        }
      }
    }
    int ans = 0;
    for (int i = 0; i < 1 << m; i++) {
      ans = max(ans, cnt[n - 1][i][0]);
    }
    cout << ans << endl;
  }
  return 0;
}
