//#include <bits/stdc++.h>
//#define int long long
//
//using namespace std;
//
//struct Answer {
//    int a1;
//    int a2;
//    int a3;
//};
//
//signed main () {
//    int n, m, k;
//    cin >> n >> m >> k;
//    vector <set<int>> G1(n, set<int>());
//    vector <set<int>> G2(n, set<int>());
//    for (int i = 0; i < m; i++) {
//        int u, v;
//        cin >> u >> v;
//        u--;
//        v--;
//        G1[u].insert(v);
//        G1[v].insert(v);
//    }
//    for (int i = 0; i < k; i++) {
//        int u, v;
//        cin >> u >> v;
//        u--;
//        v--;
//        G2[u].insert(v);
//        G2[v].insert(u);
//    }
//    if (n == 3) {
//
//    } else {
//        cout << "YES";
//        vector <Answer> ans;
//        for (int i = 0; i < n; i++) {
//            for (auto x: G1[i]) {
//                if (G2[i].find(x) == G2[i].end()) {
//                    ans.push_back()
//                }
//            }
//        }
//    }


//#include <bits/stdc++.h>
//using namespace std;
//int n, m;
//vector <int> priority(n);
//void rec(int l, int r) {
//}
//int main() {
//    cin >> m >> n;
//    for (int i = 0; n > i; i++) {
//        int temp;
//        cin >> temp;
//    }
//}

#include <bits/stdc++.h>
using namespace std;
int ans = 0;
void rec(int a, int b) {
    ans += a * b;
    if (a == b && b == 1) {
        return;
    }
    rec(max(a / 2, b), min(a / 2, b));
    if (a % 2 == 0) {
        rec(max(a / 2, b), min(a / 2, b));
    } else {
        rec(max(a / 2 + 1, b), min(a / 2 + 1, b));
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    rec(max(n, m), min(n, m));
    cout << ans;
}

