func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long MOD = 1e9 + 7;   long long n, n2 = 1, a[5010], dat[20010], ans = 0;   vector<long long> v, vv[5010];   map<long long, long long> mp;   void build(long long k, long long lb, long long ub) {     if (lb == ub) return;     build(k * 2 + 1, lb, (lb + ub) / 2);     build(k * 2 + 2, (lb + ub) / 2 + 1, ub);     dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);   }   long long query(long long k, long long lb, long long ub, long long tlb,                   long long tub) {     if (ub < tlb || tub < lb) return 2e9;     if (tlb <= lb && ub <= tub) return dat[k];     return min(query(k * 2 + 1, lb, (lb + ub) / 2, tlb, tub),                query(k * 2 + 2, (lb + ub) / 2 + 1, ub, tlb, tub));   }   long long dfs(long long lb, long long ub, long long lst) {     if (lb > ub) return 0;     long long ret = ub - lb + 1, mn = query(0, 0, n2 - 1, lb, ub), res = mn - lst;     long long num = mp[mn],               pos = lower_bound(vv[num].begin(), vv[num].end(), lb) -                     vv[num].begin(),               pos2 = lower_bound(vv[num].begin(), vv[num].end(), ub + 1) -                      vv[num].begin() - 1;     for (long long i = pos; i < pos2; i++)       res += dfs(vv[num][i] + 1, vv[num][i + 1] - 1, mn);     res += dfs(lb, vv[num][pos] - 1, mn) + dfs(vv[num][pos2] + 1, ub, mn);     ret = min(ret, res);     return ret;   }   int main() {     cin >> n;     for (int i = 0; i < n; i++) {       scanf( %I64d , &a[i]);       v.push_back(a[i]);     }     sort(v.begin(), v.end());     v.erase(unique(v.begin(), v.end()), v.end());     for (int i = 0; i < v.size(); i++) mp[v[i]] = i;     for (int i = 0; i < n; i++) vv[mp[a[i]]].push_back(i);     while (n2 < n) n2 *= 2;     for (int i = 0; i < 20005; i++) dat[i] = 1e18;     for (int i = 0; i < n; i++) dat[i + n2 - 1] = a[i];     build(0, 0, n2 - 1);     cout << dfs(0, n - 1, 0) << endl;     return 0;   }   