/* MindCoding 2016 Round 1 Vladimir VladimirM98 Milenkovic */ #include #define MID (left+right)/2 using namespace std; const int MAX_N=100010; const int MAX_TREE=4*MAX_N; const int INF=2000000010; int niz[MAX_N]; int ST[MAX_TREE]; void InitTree(int idx, int left, int right) { if (left == right) { ST[idx] = niz[left]; return; } InitTree(2*idx, left, MID); InitTree(2*idx+1, MID+1, right); ST[idx] = max(ST[2*idx], ST[2*idx+1]); } void Update(int idx, int x, int val, int left, int right) { if (left == right) { ST[idx] = val; return; } if (x <= MID) Update(2*idx, x, val, left, MID); else Update(2*idx+1, x, val, MID+1, right); ST[idx] = max(ST[2*idx], ST[2*idx+1]); } int Query(int idx, int l, int r, int left, int right) { if (l <= left && right <= r) return ST[idx]; int ret = -INF; if (l <= MID) ret = max(ret, Query(2*idx, l, r, left, MID)); if (r > MID) ret = max(ret, Query(2*idx+1, l, r, MID+1, right)); return ret; } long long gcd(long long a,long long b) { //printf("%lld %lld\n",a,b); if(b==0) return a; return gcd(b,a%b); } int pow2[20]; int main() { pow2[0]=1; for(int i=1;i<20;i++) pow2[i]=2*pow2[i-1]; int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&niz[i]); InitTree(1,1,n); long long ans=-5ll*INF; for(int l=1;ln) break; int cr=l+pow2[logg+1]-1; cr=min(cr,n); //printf("%d %d %d %d %d\n",niz[l],logg,Query(1,cl,cr,1,n)); ans=max(ans,1ll*niz[l]-logg+Query(1,cl,cr,1,n)); } } printf("%lld\n",ans); return 0; }