#include <iostream> #include <fstream> #include <vector> using namespace std; const int INF = (1<<31)-1; vector<int> lg, a, tree; int N, pos, val, Solution; void Prepare(); void Solve(); void Write(); int Query(int node, int left, int right, int a, int b); int main() { Prepare(); Solve(); Write(); return 0; } int Query(int node, int left, int right, int a, int b) { int ans = -INF; if( ( a <= left && right <= b ) || left == right) return tree[node]; int mid = (left + right) >> 1; if(a <= mid) ans = max(ans, Query(node<<1, left, mid, a, b) ); if(b > mid) ans = max(ans, Query((node<<1) + 1, mid+1, right, a, b) ); return ans; } void Build(int node, int left, int right) { if(left == right) { tree[node] = a[left]; return; } int mid = (left+right) >> 1; Build(node<<1, left, mid); Build( (node<<1) + 1, mid+1, right); tree[node] = max(tree[node<<1], tree[(node<<1)+1]); } void Solve() { for(int i=1; i<=N; ++i) { scanf("%d", &val); a.push_back(val); } Build(1, 1, N); Solution = -INF; for(pos=1; pos<N; ++pos) for(int k=0; (1<<k) < N; ++k) { int r = pos + (1<<k); int l = pos + 1; Solution = max(Solution, (a[pos] + Query(1, 1, N, l, min(r, N) ) - lg[min(r, N) - pos]) ) ; } } void Prepare() { //freopen("reddragon.in", "rt", stdin); //freopen("reddragon.out", "wt",stdout); scanf("%d", &N); tree.assign(4*N, -INF); lg.assign(2, 0); for(int i=2; i<=2*N; ++i) lg.push_back(lg[i>>1] + 1); a.push_back(0); } void Write() { cout<<Solution<<'\n'; }