//以为和八皇后一样要回溯其实不是
//直接开摆就行
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
class solution
{
public:
int res = 0;
vector<vector<bool> > vvb;
int H;
int W;
public:
solution(int H_,int W_)
{
H = H_;
W = W_;
vvb = vector<vector<bool> >(H,vector<bool>(W,false));
}
bool can_put(int x,int y)
{
if(x-2>=0&&x<H&&y<W&&y>=0&&vvb[x-2][y]==true) return false;
if(x>=0&&x+2<H&&y<W&&y>=0&&vvb[x+2][y]==true) return false;
if(x>=0&&x<H&&y<W&&y-2>=0&&vvb[x][y-2]==true) return false;
if(x>=0&&x<H&&y+2<W&&y>=0&&vvb[x][y+2]==true) return false;
return true;
}
void TraceBack()
{
for(int i=0;i<H;i++)
for(int j=0;j<W;j++)
{
if(can_put(i, j))
{
res++;
vvb[i][j] = true;
//cout<<"i:"<<i<<" j:"<<j<<endl;
}
}
cout<<res;
}
/*
void dfs(int row,int col,int count)
{
if(row==H&&col==W)
res = max(count,res);
if(can_put(row,col))
{
vvb[row][col]==true;
}
}
*/
};
int main(void)
{
int H,W;
cin>>H>>W;
solution s(H,W);
s.TraceBack();
return 0;
}