Олимпидная задача на С++

День добрый. Прошу, помогите с задачей. Условие ниже:

Вова большой любитель оригами. Для складывания бумажного самолетика ему понадобилось сложить гармошку размера 1 на 1 из листа клетчатой бумаги размера N на M. Сгибать бумагу Вова может только по линиям разлиновки. Например, если N = 3, a M = 1, то последовательность действий для сгиба выглядите так: пример

Выведите минимальное кол-во сгибов для получения гармошки.

Есть 2 примера ввода - вывода:

INPUT
2 2
OUTPUT
2

INPUT
5 3
OUTPUT
5

Вот мой код, на нем все три теста проходят(плюс банальный тест 1 1), а вот дальше - никак.

#include <string>
#include<vector>
using namespace std;
typedef long long ll;
int main(){
    ll h, w; cin >> h >> w;
    if(h == 1 || w == 1){
        cout << max(h, w) - 1 << endl;
    }
    else{
        ll a = h, b = w;
        ll c1 = 0, c2 = 0;
        while(a != 1){
            if(a % 2){ a--; c1++;}
            else{a /= 2; c1++;}
        }
        c1 += (b - 1);
        while(w != 1){
            if(w % 2){w--; c2++;}
            else{w/=2; c2++;}
        }
        c2+=(h-1);
        cout << min(c1, c2) << endl;
    }
}

По ограничениям: N <= 1000 >= M;


Ответы (0 шт):