//以为和八皇后一样要回溯其实不是

//直接开摆就行

#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;
}