#include <bits/stdc++.h> #define FOREACH(it,c) for( __typeof((c).begin()) it=(c).begin();it!=(c).end();it++) #define FOR(a,b,c) for(int a=(b);a<=(c);++a) #define ROF(a,b,c) for(int a=(b);a>=(c);--a) #define dbg(x) cout<<#x<<" = "<<(x)<<"\n"; #define pii pair<int,int> #define pll pair< ll, ll > #define pull pair< ull, ull > #define mp make_pair #define pb push_back #define fi first #define se second #define ll long long #define ull unsigned long long #define tata NULL using namespace std; const int NMAX = 100004; int a[NMAX],n, LOG[NMAX],dp[NMAX][18]; inline int Query(int X,int Y) { int d = Y-X+1; int log = LOG[d]; return max(dp[X][log],dp[X+d-(1<<log)][log]); } int main() { #ifndef ONLINE_JUDGE freopen("data.in","r",stdin); #endif // ONLINE_JUDGE cin.sync_with_stdio(false); cin.tie(tata); cin >> n; FOR(i,1,n) cin >> a[i]; FOR(i,1,n) dp[i][0] = a[i]; FOR(i,2,n) LOG[i] = LOG[i>>1]+1; for(int j = 1;(1<<j)<=n; ++j) for(int i = 1;i + (1 << j)-1<= n; ++i) dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); long long sol = -(1LL<<60); FOR(i,1,n-1) sol = max(sol,1LL*a[i]+a[i+1]); for(int len=1;(1<<len)<=n;++len) { int minlen = 1<<len; int maxlen = (1<<(len+1))-1; for(int i=minlen+1;i<=n;++i) { int x = Query(max(1,i-maxlen),i-minlen); sol = max(sol,1LL*a[i]+x-len); } } cout<<sol<<"\n"; return 0; }