Problem:
Score : 800 points

Problem Statement

There are N positive integers A_1, A_2, ..., A_N.
Takahashi can perform the following operation on these integers any number of times:

Choose 1 \leq i \leq N and multiply the value of A_i by -2.

Notice that he multiplies it by minus two.

He would like to make A_1 \leq A_2 \leq ... \leq A_N holds.
Find the minimum number of operations required. If it is impossible, print -1.

Constraints

1 \leq N \leq 200000

1 \leq A_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the answer.

Sample Input 1

4
3 1 4 1

Sample Output 1

3

One possible solution is:

Choose i=4 and multiply the value of A_4 by -2. A_1, A_2, A_3, A_4 are now 3, 1, 4, -2.

Choose i=1 and multiply the value of A_1 by -2. A_1, A_2, A_3, A_4 are now -6, 1, 4, -2.

Choose i=4 and multiply the value of A_4 by -2. A_1, A_2, A_3, A_4 are now -6, 1, 4, 4.

Sample Input 2

5
1 2 3 4 5

Sample Output 2

0

A_1 \leq A_2 \leq ... \leq A_N holds before any operation is performed.

Sample Input 3

8
657312726 129662684 181537270 324043958 468214806 916875077 825989291 319670097

Sample Output 3

7

Solution in Python (3.4.3) (judge verdict: Time Limit Exceeded)

def do_sub(A):
    if len(A) <= 1: return 0

    N = len(A)
    res = 0
    for i in range(1, N):
        if A[i-1] <= A[i]: continue
        d = (A[i-1]+A[i]-1)//A[i]
        if (d & (d-1)) != 0:
            d <<= 1

        bl = d.bit_length() // 2 * 2
        res += bl
        A[i] <<= bl

    return res

def do(A, k):
    # [:k]: negative
    # [k:]: positive
    res = k
    res += do_sub([2*ai for ai in A[:k]][::-1])
    res += do_sub(A[k:])
    return res

def main():
    N = int(input())
    A = list(map(int, input().split()))

    if A == sorted(A):
        print(0)
        return 0

    lb, ub = 0, N
    res = 1e308
    while ub-lb > 1:
        mid = (lb+ub) >> 1
        left = do(A, mid)
        right = do(A, mid+1)
        res = min(res, left, right)
        if left < right:
            ub = mid
        else:
            lb = mid

    print(res)
    return 0

main()