#include #include #define INF 10000000000 #define NMAX 50005 using namespace std; long long n , st , dr , ans = -INF , mx; long long v[NMAX] , arbint[5 * NMAX]; void read(long long &x) { int sign = 1; char ch; while(!isdigit(ch = getchar())) { if(ch == '-') { sign = -1; } else { sign = 1; } } do { x = x * 10 + ch - '0'; }while(isdigit(ch = getchar())); x *= sign; } void query(long long a , long long b , long long st , long long dr , long long nr); void pr(long long st , long long dr , long long nr); int main() { #ifndef ONLINE_JUDGE freopen("input.txt" , "r" , stdin); #endif // ONLINE_JUDGE read(n); for(int i = 1 ; i <= n ; ++i) { read(v[i]); } pr(1 , n , 1); for(long long i = 1 ; i <= n ; ++i) { for(long long j = 1 , nr = 0 ; j < i ; j <<= 1 , ++nr) { long long st = max(i - 2 * j + 1 , (long long)1); long long dr = i - j; mx = -INF; query(st , dr , 1 , n , 1); ans = max(ans , mx + v[i] - nr); } } cout << ans; return 0; } void pr(long long st , long long dr , long long nr) { if(st == dr) { arbint[nr] = v[st]; return; } long long mij = (st + dr) / 2; pr(st , mij , nr * 2); pr(mij + 1 , dr , nr * 2 + 1); arbint[nr] = max(arbint[2 * nr] , arbint[2 * nr + 1]); } void query(long long a , long long b , long long st , long long dr , long long nr) { if(st == dr) { mx = max(mx , arbint[nr]); return; } long long mij = (st + dr) / 2; if(a <= mij) { query(a , b , st , mij , 2 * nr); } if(b > mij) { query(a , b , mij + 1 , dr , 2 * nr + 1); } }