#include <bits/stdc++.h>
using namespace std;
namespace std {
template <>
struct hash<pair<int, int>> {
  inline size_t operator()(const pair<int, int> &v) const {
    hash<int> int_hasher;
    return int_hasher(v.first) ^ int_hasher(v.second);
  }
};
};  // namespace std
template <class T>
using pqg = priority_queue<T, vector<T>, greater<T>>;
template <typename T>
void print(T t) {
  cout << t << endl;
}
template <typename T, typename... Args>
void print(T t, Args... args) {
  cout << t << " ";
  print(args...);
}
char getAnother(char c1, char c2) {
  for (int i = min((int)0, (int)26); i < max((int)0, (int)26); i += 1) {
    char c = 'a' + i;
    if (c != c1 && c != c2) return c;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  if (n == 1)
    print(m);
  else if (m == 1)
    print(n);
  else if (n == 2) {
    long long res = 0;
    for (int i = min((int)0, (int)m); i < max((int)0, (int)m); i += 1) {
      if (i % 4 == 0 || i % 4 == 1) res += 2;
    }
    print(res);
  } else if (m == 2) {
    long long res = 0;
    for (int i = min((int)0, (int)n); i < max((int)0, (int)n); i += 1) {
      if (i % 4 == 0 || i % 4 == 1) res += 2;
    }
    print(res);
  } else if (n * m % 2 == 0)
    print(n * m / 2);
  else {
    print(n * m / 2 + 1);
  }
  return 0;
}
