#include <stdio.h>
#include <iostream>
#include <vector>
#define ll long long
#define inf 2000000000
#define MaxN 200000
using namespace std;

ll getstep(int l, int r, ll m);
void getder(int l, int r, int cur);
int getmin(int tl, int tr, int l, int r, int cur);
vector<ll> Arr(MaxN);
vector<int> Min(4*MaxN);
int n;

int main(void)
{
    scanf("%i",&n);
    for (int i=0; i<n; i++)
        scanf("%lli",&Arr[i]);
    getder(0, n-1, 0);
    printf("%lli\n",getstep(0,n-1,0));
}
ll getstep(int l, int r, ll m)
{
    if (l>r)
        return 0;
    if (l==r)
        return Arr[l]-m;
    int Mi=getmin(0, n-1, l, r, 0);
    return getstep(l, Mi-1, Arr[Mi])+getstep(Mi+1, r, Arr[Mi])+Arr[Mi]-m;
}
void getder(int l, int r, int cur)
{
    if (l>r)
        return;
    if (l==r)
    {
        Min[cur]=l;
        return;
    }
    getder(l, (l+r)/2, cur*2+1);
    getder((l+r)/2+1,  r, cur*2+2);
    Min[cur]=Arr[Min[cur*2+1]]<Arr[Min[cur*2+2]]?Min[cur*2+1]:Min[cur*2+2];
}
int getmin(int tl, int tr, int l ,int r, int cur)
{
    if ((l>r) || (tl>l) || (tr<r))
        return inf;
    if ((tl==l) && (tr==r))
        return Min[cur];
    int m1=getmin(tl, (tl+tr)/2, l, min(r, (tl+tr)/2), cur*2+1),
    m2=getmin((tl+tr)/2+1, tr, max(l, (tl+tr)/2+1), r, cur*2+2);
    if (m1==inf)
        return m2;
    if (m2==inf)
        return m1;
    return Arr[m1]<Arr[m2]?m1:m2;
}
