#include<stdio.h>
long long a[1000002];
long long b[1000002];
long long arr[1000002];
long long brr[1000002];
#include<iostream>
using namespace std;
int main()
{
long long n, i, x, min1, min2, min3, MN;
x = 1e18;//取一个极大值
scanf("%lld", &n);
if (n < 3)//怪小于3只,直接魔法kill全部
{
printf("0");
return 0;
}
for (i = 1; i <= n; i++)//数组首尾都是0(注意存储方式)
{
scanf("%lld", &a[i]);
b[i] = a[i];
}
for (i = 1; i <= n; i++)//从最左边开始
{
if (a[i] > 0)
{
arr[i] = a[i] + arr[i - 1];//累加每次砍完后还剩余的要砍的次数
if (a[i + 1] != 0 && a[i + 1] > a[i])//i+1怪血量大于i,保留a被砍去a【i】点血后的值
a[i + 1] -= a[i];
else//直接将i+1怪物kill
a[i + 1] = 0;
if (a[i + 2] != 0 && a[i + 2] > a[i])//i+2怪血量大于i,保留a被砍去a【i】点血后的值
a[i + 2] -= a[i];
else//直接将i+2怪物kill
a[i + 2] = 0;
}
else
arr[i] = arr[i - 1];//如果最左边一开始就为0,让要砍的次数和i-1一样
}
for (i = n; i >= 1; i--)//从最右边开始
{
if (b[i] > 0)//血量不为0
{
brr[i] = b[i] + brr[i + 1];//注意不同点
if (b[i - 1] != 0 && b[i - 1] > b[i])
b[i - 1] -= b[i];
else
b[i - 1] = 0;
if (b[i - 2] != 0 && b[i - 2] > b[i])
b[i - 2] -= b[i];
else
b[i - 2] = 0;
}
else//如果最右边一开始就为0,让它的血量和i-1一样
brr[i] = brr[i + 1];
}
min1 = brr[3];//魔法A最左边
min2 = arr[n - 2];//魔法A最右边
min3 = min(min1, min2);//比较两者哪个用的次数最少
for (i = 4; i <= n - 2; i++)
{
x = min(x, arr[i-1] + brr[i + 2]);//魔法中间的怪
}
MN = min(x, min3);//找寻最优的方法
printf("%lld", MN);
return 0;
}