#include <iostream>
#include <vector>
#include <map>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
#define int long long
const int N = 1e5 + 4;
vector<int> vec;
int n;
//方法:二分答案(答案一定位于高度数组的最大值与最小值之间,具有单调性,所以可以采用二分答案)
//注意:在机器人跳跃的过程中,甚至可能出现 long 越界的情况,比如 长度为 1000 的 {1, ...., 1}能量初始值为 5 的情况,后面会累加2的幂次,结果很恐怖
//所以需要在 check函数中传入 max参数,用于比较剪枝:当处于某处其能量值大于整个高度数组的最大值的时候,这时候一定能通关,无需进行下一步判断,直接剪枝
bool check(int mid, int max)
{
int e = mid;
for (int i = 0; i < n; i++)
{
if (vec[i] > e) e -= (vec[i] - e);
else e += (e - vec[i]);
if (e < 0) return false;
if(e >= max) return true;
}
return true;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
vec.resize(n);
for (int i = 0; i < n; i++)
{
cin >> vec[i];
}
int l = *min_element(vec.begin(), vec.end()), r = *max_element(vec.begin(), vec.end());
while (l <= r)
{
int mid = (l + r) >> 1;
if (check(mid, *max_element(vec.begin(), vec.end()))) r = mid - 1;
else l = mid + 1;
}
cout << l << endl;
return 0;
}