#include #include #include #include #include #define TASKNAME "firs" typedef double real; const int MaxN = 131072; const real MaxC = 1E400; real a [MaxN * 2]; int n; #define min(a,b) ((a)<(b)?(a):(b)) int main (void) { int i, j, k, n; int res; freopen (TASKNAME ".in", "rt", stdin); freopen (TASKNAME ".out", "wt", stdout); /* 1. Чтение входных данных */ /* Цикл для возможности тестирования более чем на одном тесте сразу */ while (scanf (" %d", &n) != EOF) { /* Перед первой ёлкой и после последней стоят фиктивные с пушистостью MaxC */ for (i = 0; i < MaxN * 2; i++) a[i] = MaxC; for (i = 1; i <= n; i++) scanf (" %lf", &a[i + MaxN]); /* 2. Построение дерева промежутков */ for (i = MaxN - 1; i >= 1; i--) a[i] = min (a[i << 1], a[(i << 1) + 1]); /* 3. Моделирование процесса, описанного в условии */ for (res = 0; a[1] < MaxC; res++) { /* Поиск первого минимума */ i = 1; while (i < MaxN) { if (a[i << 1] == a[i]) i <<= 1; else i = (i << 1) + 1; } /* Удвоение пушистости трёх ёлок */ for (j = i - 1; j <= i + 1; j++) { k = j; a[k] *= 2.0; for (k >>= 1; k >= 1; k >>= 1) /* коррекция минимумов */ a[k] = min (a[k << 1], a[(k << 1) + 1]); } /* Поиск первого минимума */ i = 1; while (i < MaxN) { if (a[i << 1] == a[i]) i <<= 1; else i = (i << 1) + 1; } /* Удаление трёх ёлок */ for (j = i - 1; j <= i + 1; j++) { k = j; a[k] = MaxC; for (k >>= 1; k >= 1; k >>= 1) /* коррекция минимумов */ a[k] = min (a[k << 1], a[(k << 1) + 1]); } } /* 4. Вывод ответа */ printf ("%d\n", res); } return 0; }