#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long int LINF = 1LL << 56;
int n, m;
int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[] = {-1, -2, -2, -1, 1, 2, 2, 1};
int vis[1010][1010];
void dfs(int x, int y, int c) {
  vis[x][y] = c;
  for (int i = (int)0; i < (int)8; i++) {
    int ax = x + dx[i], ay = y + dy[i];
    if (ax >= 0 && ax < n && ay >= 0 && ay < m && !vis[ax][ay]) {
      dfs(ax, ay, c * -1);
    }
  }
}
int main() {
  cin >> n >> m;
  int ans = 0, aux;
  aux = 0;
  memset(vis, 0, sizeof vis);
  for (int i = (int)0; i < (int)n; i++)
    for (int j = (int)0; j < (int)m; j++) {
      if (!vis[i][j]) {
        dfs(i, j, 1);
      }
    }
  for (int i = (int)0; i < (int)n; i++)
    for (int j = (int)0; j < (int)m; j++) aux = aux + (vis[i][j] == 1);
  ans = max(ans, aux);
  swap(n, m);
  aux = 0;
  memset(vis, 0, sizeof vis);
  for (int i = (int)0; i < (int)n; i++)
    for (int j = (int)0; j < (int)m; j++) {
      if (!vis[i][j]) {
        dfs(i, j, 1);
      }
    }
  for (int i = (int)0; i < (int)n; i++)
    for (int j = (int)0; j < (int)m; j++) aux = aux + (vis[i][j] == 1);
  ans = max(ans, aux);
  cout << ans << "\n";
  return 0;
}
