#include <bits/stdc++.h>
using namespace std;
const long long fx[] = {-2, -2, -1, -1, 1, 1, 2, 2};
const long long fy[] = {-1, 1, -2, 2, -2, 2, -1, 1};
const long long N = 1e3 + 5, K = 20, mod = 1000000007, MOD = 1000000007,
                INF = LLONG_MAX / 2;
vector<pair<long long, long long> > adj[N][N];
long long col[N][N], vis[N][N];
long long w = 0, b = 0;
void dfs(long long x, long long y) {
  if (col[x][y] == 1)
    w++;
  else
    b++;
  vis[x][y] = 1;
  for (auto p : adj[x][y]) {
    if (vis[p.first][p.second]) continue;
    col[p.first][p.second] = 3 - col[x][y];
    dfs(p.first, p.second);
  }
}
void solve() {
  long long n, m;
  cin >> n >> m;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      for (long long k = 0; k < 8; k++) {
        long long nx = i + fx[k], ny = j + fy[k];
        if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
        adj[i][j].push_back({nx, ny});
      }
    }
  }
  long long ans = 0;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      if (!vis[i][j]) {
        w = 0;
        b = 0;
        col[i][j] = 1;
        dfs(i, j);
        ans += max(w, b);
      }
    }
  }
  cout << ans << endl;
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  long long TESTS = 1;
  while (TESTS--) {
    solve();
  }
  return 0;
}
