// RandomUsername (Nikola Jovanovic) // MindCoding 2016 // Round 1 // D #include #define DBG false #define debug(x) if(DBG) printf("(ln %d) %s = %d\n", __LINE__, #x, x); #define lld long long #define ff(i,a,b) for(lld i=a; i<=b; i++) #define fb(i,a,b) for(int i=a; i>=b; i--) #define par pair #define fi first #define se second #define mid (l+r)/2 #define INF 1000000000 #define MAXN 100005 #define MAXLOGN 20 using namespace std; lld n; lld a[MAXN]; lld st[MAXN][MAXLOGN]; lld pow2[MAXN]; void init() { pow2[1] = 0; for(lld i = 2; i < MAXN; i++) { pow2[i] = pow2[i/2] + 1; } for(lld i = 1; i <= n; i++) st[i][0] = a[i]; for(lld deg = 1; (1 << deg) <= n; deg++) { for(lld i = 1; i <= n; i++) { st[i][deg] = st[i][deg-1]; lld leap = (1 << (deg-1)); if(i + leap <= n) st[i][deg] = max(st[i][deg-1], st[i + leap][deg-1]); } } } lld get(lld a, lld b) { lld bestPow = pow2[b - a + 1]; return max( st[a][bestPow], st[b + 1 - (1 << bestPow)][bestPow] ); } int main() { scanf("%lld", &n); ff(i, 1, n) scanf("%lld", &a[i]); init(); lld ret = -1; bool dn = false; ff(L, 1, n) { lld off = 1; ff(lg, 0, 17) { if(L+off > n) break; lld val = get(L+off, min(n, L+off*2-1) ); off *= 2; lld curr = a[L] + val - lg; if(!dn) { ret = curr; dn = true; } else { ret = max(ret, curr); } } } printf("%lld\n", ret); return 0; }