#include #include using namespace std; #define MAX 100010 #define INF (1<<30) + 2 int n, doi[MAX], a[2 * MAX][21]; int intre(int i, int j) { int lg = j - i + 1; lg = doi[lg]; return max(a[i][lg], a[j - (1 << lg) + 1][lg]); } int main() { int i, j; long long best = 2ll * (-INF); cin >> n; doi[1] = 0; for(i = 1 ; i <= n ; i++) { if(i - 1) doi[i] = doi[i / 2] + 1; cin >> a[i][0]; a[i + n][0] = -INF; } for(j = 1 ; (1 << j) <= 2 * n ; j++) { for(i = 1 ; i <= n ; i++) { a[i][j] = max(a[i][j - 1], a[i + (1<<(j - 1))][j - 1]); // cout << a[i][j] << " "; } // cout << "\n"; } for(i = 1 ; i < n ; i ++) { for(j = 0 ; i + (1 << j) <= 2 * n ; j++) { //cout << i << " " << j << " " << a[i][0] << " " << a[i + 1][j] << " " << j << "\n"; best = max(best, 1ll * a[i][0] + intre(i + 1, min(n, i + (1 << (j + 1)) - 1)) - j); //cout << i + 1 << ' ' << min(n, i + (1 << (j + 1)) - 1) << "\n"; // cout << i << " " << j << " " << best << "\n"; } } cout << best << "\n"; }