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 C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		int N = int.Parse(Console.ReadLine());
		string[] str = Console.ReadLine().Split();
		long[]A = new long[N];
		for(var i=0;i<N;i++){
			A[i] = long.Parse(str[i]);
		}
		long ct1 = 0;
		long ca1 = A[0];
		long ct2 = 1;
		long ca2 = -2 * A[0];
		for(var i=1;i<N;i++){
			long cb1 = A[i];
			long cta1 = ct1;
			while(ca1 > cb1){
				cb1 *= 4;
				cta1 += 2;
			}
			long cta1a = cta1;
			long cb1a = cb1;
			long ct2a = ct2;
			long cb2a = A[i];
			bool flag = false;
			//Console.WriteLine(ct2+" "+cta1);
			if(ct2 > cta1){
				while(cb2a<cb1a){
					//Console.WriteLine(cb2a+" "+cb1a);
					cb2a *= 4;
					ct2a += 2;
				}
				if(ct2a <= cta1a){
					flag = true;
				}
			} else {
				while(cb1a<cb2a){
					//Console.WriteLine(cb1a+" "+cb2a);
					cb1a *= 4;
					cta1a += 2;				
				}
				if(ct2a <= cta1a){
					flag = true;
				}
			}
			if(flag){
			//if(ct2 <= cta1){
				ct1 = ct2;
				ca1 = ca2;
			} else {
				ct1 = cta1;
				ca1 = cb1;
			}
			ct2 += 1;
			while(-2*A[i] < ca2){
				ca2 *= 4;
				ct2 += i * 2;
			}
		}
		Console.WriteLine(ct1);
	}
}