#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<set>
//#include<>
using namespace std;
int dx[5]={0,1,0,-1,0};
int dy[5]={-1,0,1,0,0};
int a[50][50];
int n,m,kill;
bool ok(int o,int p){
return o>=0&&o<n&&p>=0&&p<m;
}
void dfs(int x){
vector<pair<int,int> > task;
int x1=-1,y1=-1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!a[i][j]){
x1=i;
y1=j;
break;
}
}
if(x1!=-1){
break;
}
}
if(x1==-1){
kill=x;
return;
}
if(x+1>=kill){
return;
}
for(int i=0;i<5;i++){
int x2=x1+dx[i];
int y2=y1+dy[i];
if(ok(x2,y2)){
task.clear();
for(int j=0;j<5;j++){
int x3=x2+dx[j];
int y3=y2+dy[j];
if(ok(x3,y3)&&!a[x3][y3]){
task.push_back(make_pair(x3,y3));
a[x3][y3]=1;
}
}
dfs(x+1);
for(int j=0;j<task.size();j++){
a[task[j].first][task[j].second]=0;
}
}
}
}
int main(){
cin>>n>>m;
kill=n*m;
int YNWA=kill;
dfs(0);
cout<<YNWA-kill;
}