#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int p[N], g[N], f[N]; // 股票价格p[N],第一次交易最大收益g[N], 第二次交易最大收益f[N]
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", &p[i]);
// 求g[i]:在1 ~ i天中买卖一次的最大收益:max(不在第i天卖出,在前一天卖出g[i - 1], 在第i天卖出p[i] - minv)
// minv: 1 ~ i天的价格的最小值
// 枚举在哪一天卖出
// 前面res = max(res, p[i] - minv)
for (int i = 2, minv = p[1]; i <= n; i ++ ) {
g[i] = max(g[i - 1], p[i] - minv);
minv = min(minv, p[i]);
}
// 优化:先预处理一遍,把时间复杂度由O(n^2) 到O(n)
// 如果不预处理,O(n^2) 时间复杂度
// res = 前1~i-1天买卖一次的最大收益(考虑卖出)+ i+1~n第二次买卖一次的最大收益(考虑卖出),之后取max更新
// for (int i = 2, min = p[i]; i <= n; i ++ ) {
// g[i] = max(g[i - 1], p[i] - minv1);
// minv1 = min(minv, p[i]);
// for (j = i + 2, min = p[i + 1]; j <= n; j ++ ) {
// g[j] = max(g[j - 1], p[j] - minv2);
// minv2 = min(minv2, p[j]);
// res = max(res, f[i] + g[j]);
// }
// }
// 先从后预处理之后,O(n^2) 时间复杂度
// res = 前1~i天买卖一次的最大收益(考虑卖出) + 第i+1~n天买卖一次的最大收益(考虑买入),再取max更新
// 求f[i]: 在i ~ n中买卖一次的最大收益: max(不在第i天买入,在下一天买入f[i + 1], 在第i天买入maxv - p[i])
// 枚举在那一天买入
for (int i = n - 1, maxv = p[n]; i >= 1; i -- ) {
f[i] = max(f[i + 1], maxv - p[i]);
maxv = max(maxv, p[i]);
}
int res = 0;
for (int i = 2; i <= n; i ++ ) res = max(res, g[i] + f[i + 1]);
printf("%d\n", res);
return 0;
}