#include using namespace std; #define pb push_back #define sz size #define mp make_pair #define ll long long const int NMAX = 1e5+5; //const int INF = ; int n, a[NMAX], aint[4*NMAX]; void faAint(int node, int st, int dr){ if (st == dr){ aint[node] = a[st]; }else{ int mij = (st + dr) / 2; faAint(node*2, st, mij); faAint(node*2+1, mij+1, dr); aint[node] = max(aint[node*2], aint[node*2+1]); } } void query(int node, int st, int dr, int a, int b, int &ans){ if (a <= st && dr <= b){ ans = max(ans, aint[node]); }else{ int mij = (st + dr) / 2; if (a <= mij){ query(node*2, st, mij, a, b, ans); } if (b > mij){ query(node*2+1, mij+1, dr, a, b, ans); } } } int main(){ #ifndef ONLINE_JUDGE freopen("test.in", "r", stdin); //freopen("test.out", "w", stdout); #endif cin >> n; for(int i=1; i<=n; ++i){ cin >> a[i]; } faAint(1, 1, n); ll anss = 0; for(int i=1; i<=n; ++i){ for(int j=1,r=0; ; j*=2, ++r){ int newI = i + j + j-1; int flag = 0; if (newI > n){ newI = n; flag = 1; } int maxx = -2000000000; query(1, 1, n, i+1, newI, maxx); ll currentAns = 1LL*a[i] +maxx - r; //cout << i << " " << newI << " " << r << " " << a[i] << " " << maxx << " " << currentAns << "\n"; anss = max(anss, currentAns); if (flag == 1){ break; } } } cout << anss << "\n"; return 0; }