#include<bits/stdc++.h>
#define mp make_pair
#define ll long long
#define all(v) v.begin(),v.end()
using namespace std;
namespace data{
	const int INF=2147483647;
	const int Inf=0x3f3f3f3f;
	const double PI=3.1415926535897932384626;
}
namespace mypii{
	struct PII{
		int first,second;
		PII(){}
		PII(int f, int s): first(f),second(s){}
		inline bool operator <(const PII& x)const{
			if(first!=x.first) return first<x.first;
			return second<x.second;
		}
		inline bool operator ==(const PII& x)const{
			return first==x.first and second==x.second;
		}
		inline bool operator >(const PII& x)const{
			if(first!=x.first) return first>x.first;
			return second>x.second;
		}
		inline bool operator !=(const PII& x)const{
			return first!=x.first and second!=x.second;
		}
	};
}

namespace make_data{
	ofstream out;
	ifstream in;
	inline string itos(int x){
		string rt="";
		while(x) rt=(char)(x%10+'0')+rt,x/=10;
		return rt;
	}
	class My_io_s{
		public:
		void openoi(int x){out.open(("T_"+itos(x)+".in").c_str());}
		void openoo(int x){out.open(("T_"+itos(x)+".out").c_str());}
		void openii(int x){in.open(("T_"+itos(x)+".in").c_str());}
		void openio(int x){in.open(("T_"+itos(x)+".out").c_str());}
		void open1(int x){openoi(x);}
		void open2(int x){openii(x);openoo(x);}
		void closei(){in.close();}
		void closeo(){out.close();}
		void close(){closei();closeo();}
		void oii(int a,int b){out<<a<<' '<<b<<endl;}
		void oi_(int x){out<<x<<' ';}
		void oip(int x){out<<x<<endl;}
	}My;
}
namespace runtime{
	clock_t __stt;
	inline void TStart(){__stt=clock();}
	inline void TReport(){printf("\nTaken Time : %.3lf sec\n",(double)(clock()-__stt)/CLOCKS_PER_SEC);}
}
namespace quickread{
	inline void rdl(long long &val){
	    long long x=0;
	    int f=1;
	    char ch=getchar();
	    while((ch<'0' or ch>'9') and ch!='-') ch=getchar();
	    if(ch=='-'){
	        f=-1;
	        ch=getchar();
	    }
	    while(ch>='0' and ch<='9'){
	        x=(x<<3)+(x<<1)+ch-'0';
	        ch=getchar();
	    }
	    val=x*f;
	}
	inline void rdi(int &val){
	    int x=0;
	    int f=1;
	    char ch=getchar();
	    while((ch<'0' or ch>'9') and ch!='-') ch=getchar();
	    if(ch=='-'){
	        f=-1;
	        ch=getchar();
	    }
	    while(ch>='0' and ch<='9'){
	        x=(x<<3)+(x<<1)+ch-'0';
	        ch=getchar();
	    }
	    val=x*f;
	}
	inline long long rdl(){
	    long long x=0;
	    int f=1;
	    char ch=getchar();
	    while((ch<'0' or ch>'9') and ch!='-') ch=getchar();
	    if(ch=='-'){
	        f=-1;
	        ch=getchar();
	    }
	    while(ch>='0' and ch<='9'){
	        x=(x<<3)+(x<<1)+ch-'0';
	        ch=getchar();
	    }
	    return x*f;
	}
	inline int rdi(){
	    int x=0;
	    int f=1;
	    char ch=getchar();
	    while((ch<'0' or ch>'9') and ch!='-') ch=getchar();
	    if(ch=='-'){
	        f=-1;
	        ch=getchar();
	    }
	    while(ch>='0' and ch<='9'){
	        x=(x<<3)+(x<<1)+ch-'0';
	        ch=getchar();
	    }
	    return x*f;
	}
	inline void write(int x){
	    if(x<0) putchar('-'),x=-x;
	    if(x>9) write(x/10);
	    putchar(x%10+'0');
	}
	inline void _write(int x){
		write(x);
		putchar(' ');
	}
	inline void print(int x){
		write(x);
		putchar('\n');
	}
	inline void write(ll x){
	    if(x<0) putchar('-'),x=-x;
	    if(x>9) write(x/10);
	    putchar(x%10+'0');
	}
	inline void _write(ll x){
		write(x);
		putchar(' ');
	}
	inline void print(ll x){
		write(x);
		putchar('\n');
	}
}
namespace dsu{
	int par[200200];
	inline void init(int _n){for(int i=0;i<_n;++i) par[i]=i;}
	inline int find(int now){
		if(par[now]==now) return now;
		return par[now]=find(par[now]);
	}
	inline bool unite(int a, int b){
		int Pa(find(a)),Pb(find(b));
		if(Pa==Pb) return false;
		par[Pa]=Pb;
		return true;
	}
}
using namespace quickread;
using namespace dsu;
using namespace mypii;
using namespace make_data;
using namespace runtime;
using namespace data;
namespace mcf{
	struct Edge{
		int to,cap,rev,cost;
		Edge(){}
		Edge(int to,int cap,int rev,int cost):to(to),cap(cap),rev(rev),cost(cost){}
	};
	vector<Edge> egs[1005];
	void newedge(int u,int v,int cap,int cost){
		egs[u].emplace_back(v,cap,egs[v].size(),cost);
		egs[v].emplace_back(u,0,egs[u].size()-1,-cost);
	}
	int dist[1005],h[1005];
	int prv[1005],pre[1005];
	inline pair<int,int>getans(int s,int t){
		int flow=0,cost=0;
		for(;;){
			priority_queue<pair<int,int> >pq;
			memset(dist,0x3f,sizeof(dist));
			dist[s]=0;
			pq.emplace(0,s);
			for(;pq.size();){
				pair<int,int> X=pq.top();
				pq.pop();
				int now=X.second;
				if(dist[now]!=X.first)continue;
				for(int i=0;i<egs[now].size();++i){
					Edge &e=egs[now][i];
					if(e.cap&&dist[e.to]>dist[now]+e.cost+h[now]-h[e.to]){
						dist[e.to]=dist[now]+e.cost+h[now]-h[e.to];
						prv[e.to]=now;
						pre[e.to]=i;
						pq.emplace(dist[e.to],e.to);
					}
				}
			}
			if(dist[t]==Inf)return mp(flow,cost);
			for(int i=s;i<=t;++i)h[i]+=dist[i];
			int fl=Inf;
			for(int i=t;i!=s;i=prv[i])fl=min(fl,egs[prv[i]][pre[i]].cap);
			flow+=fl;
			cost+=fl*h[t];
			for(int i=t;i!=s;i=prv[i]){
				Edge &e=egs[prv[i]][pre[i]];
				e.cap-=fl;
				egs[i][e.rev].cap+=fl;
			}
		}
	}
}
using namespace mcf;
namespace Max_Segment_Tree{
	const int mAxn=3e5+5;
	struct M_Sgt{
		int mx[mAxn<<3],lazy[mAxn<<3];
		inline void modify(int x,int l,int r,int L,int R,int d){
			if(L<=l and r<=R){
				mx[x]+=d;
				lazy[x]+=d;
				return;
			}
			int md=l+r>>1;
			if(L<=md)modify(x<<1,l,md,L,R,d);
			if(md<R)modify(x<<1|1,md+1,r,L,R,d);
			mx[x]=max(mx[x<<1],mx[x<<1|1])+lazy[x];
		}
		inline void init(){
			memset(lazy,0,sizeof(lazy));
			memset(mx,-0x3f,sizeof(mx));
		}
	};
}
using namespace Max_Segment_Tree;
const int maxn=1000;
char buffer[maxn],*S,*T;
inline char Get_Char(){
    if(S==T){
        T=(S=buffer)+fread(buffer,1,maxn,stdin);
        if(S==T)return EOF;
    }
    return *S++;
}

inline int read(){
    char c;
    int re=0,f=0;
    for(c=Get_Char();c<'0' or c>'9';c=Get_Char())if(c=='-')f=1;
    for(;c>='0' and c<='9';)re=(re<<1)+(re<<3)+(c-'0'),c=Get_Char();
    if(f)return -re;
    return re;
}

inline void read(int&x){
    char c;
    int re=0,f=0;
    for(c=Get_Char();c<'0' or c>'9';c=Get_Char())if(c=='-')f=1;
    for(;c>='0' and c<='9';)re=(re<<1)+(re<<3)+(c-'0'),c=Get_Char();
    if(f)x=-re;
    else x=re;
}
ll n,m;
ll ans;
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	if(n>m)swap(n,m);
	if(n==1){
		cout<<1<<'\n';
		return 0;
	}
	ll a=(n+1)/2;
	cout<<a*((int)((m+1ll)/2ll))+(n-a)*(m-(int)((m+1ll)/2ll));
}

Measured memory_bytes: 256