//时间复杂度为2^(n*m),有点大啊,by lizhicheng
#include<stdio.h>
#define INF 99999999
int vis[50][50],n,m;
int dx[]= {0,0,-1,1};
int dy[]= {-1,1,0,0};
int check(int x,int y) {int i,f=0;for(i=0; i<4; ++i)f=f||vis[x+dx[i]][y+dy[i]];if(!f) return 0;if(x-1>0) {f=vis[x-1][y];for(i=0; i<4; ++i)f=f||vis[x-1+dx[i]][y+dy[i]];if(!f) return 0;}if(x+1<=n) {f=vis[x+1][y];for(i=0; i<4; ++i)f=f||vis[x+1+dx[i]][y+dy[i]];if(!f) return 0;}if(y+1<=m) {f=vis[x][y+1];for(i=0; i<4; ++i)f=f||vis[x+dx[i]][y+1+dy[i]];if(!f) return 0;}if(y-1>0) {f=vis[x][y-1];for(i=0; i<4; ++i)f=f||vis[x+dx[i]][y-1+dy[i]];if(!f) return 0;}return 1;
}
int dfs(int x,int y,int cnt) {//x,y表示当前搜索到的位置,cnt表示当前已经放的哨兵数量int xt,yt,ret1=INF,ret2=INF,i,j;if(x==n+1)return cnt;if(y+1>m) {xt=x+1;yt=1;} else {xt=x;yt=y+1;}vis[x][y]=0;if(check(x,y)) ret1=dfs(xt,yt,cnt-1);vis[x][y]=1;ret2=dfs(xt,yt,cnt);return ret1<ret2?ret1:ret2;
}
int main() {int i,j;scanf("%d%d",&n,&m);for(i=1; i<=n; ++i)for(j=1; j<=m; ++j)vis[i][j]=1;printf("%d\n",dfs(1,1,n*m));return 0;
}