#include using namespace std; int V[500000]; int T[1000000]; void init(int node, int b, int e) { if(b == e) T[node] = V[b]; else { int m = b + e >> 1; init(node*2, b, m); init(node*2+1, m+1, e); T[node] = max(T[node*2], T[node*2+1]); } } int query(int node, int b, int e, int l, int r) { if(l == 0) return -2e9; if(l <= b && e <= r) return T[node]; if(r < b || l > e) return -2e9; int m = b + e >> 1; return max(query(node*2, b, m, l, r), query(node*2+1, m+1, e, l, r)); } void Read(int &a) { char c, sgn = 0; for(c = getchar(); !isdigit(c) && c != '-'; c = getchar()); if(c == '-') sgn = 1, c = getchar(); for(a = 0; isdigit(c); c= getchar()) a = (a << 1) + (a << 3) + c - '0'; if(sgn) a = -a; } int main() { #ifndef ONLINE_JUDGE //freopen("debug", "r", stdin); #endif // ONLINE_JUDGE int n; Read(n); for(int i=1; i<=n; i++) { Read(V[i]); } init(1, 1, n); int best = -2e9; for(int i=2; i<=n; i++) { for(int j=0; (1 << j) < i; j++) { best = max(best, V[i] + query(1, 1, n, i - (1 << (j + 1)) + 1, i - 1) - j); } } cout << best; return 0; }