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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define ll long long
#define ull unsigned long long
#define db double
#define pb push_back
#define ppb pop_back
#define all(x) (x).begin(), (x).end()

template <typename T>
using pr = array <T, 2>;

template <typename T>
using ord_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll INF = 1e18;

int d(ll x, ll y) {
	int res = 0;
	if (x > y) {
		while (y < x) {
			y *= 4;
			res++;
		}
	}	else {
		while (x * 4 <= y) {
			x *= 4;
			res--;
		}
	}
	return res;
}

vector <ll> get(vector <ll> & v) {
	int n = v.size();
	vector <ll> c(n - 1), f(n);
	for (int i = 0; i < n - 1; i++) {
		c[i] = d(v[i], v[i + 1]);
	}
	stack <pr <ll>> st;
	st.push({n - 1, INF});
	for (int i = n - 2; i >= 0; i--) {
		f[i] = f[i + 1];
		if (c[i] < 0) {
			st.push({i, -c[i]});
		}	else {
			int x = c[i];
			while (x--) {
				f[i] += st.top()[0] - i;
				st.top()[1]--;
				if (!st.top()[1]) {
					st.pop();
				}
			}
		}
	}
	return f;
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	#ifdef LOCAL
		freopen("input.txt", "r", stdin);
	#endif
	
	int n;
	cin >> n;
	vector <ll> a(n);
	for (auto & i : a) {
		cin >> i;
	}
	vector <ll> suf = get(a);
	reverse(all(a));
	vector <ll> pref = get(a);
	reverse(all(pref));
	ll res = min(2 * pref[n - 1] + n, 2 * suf[0]);
	for (int i = 0; i < n - 1; i++) {
		res = min(res, 2 * (pref[i] + suf[i + 1]) + (i + 1));
	}
	cout << res;
}