#include #define inff 100000 #include using namespace std; void readArray( long& n, long long arr[ ] ){ cin >> n; for ( int i = 0; i < n; i ++ ){ cin >> arr[i]; } } void createAuxiliarArray( long n, long long arr[ ], long aux[ ] ){ for ( int i = 0; i < n; i ++ ){ aux[i] = i; } } void mergeSort ( long left, long mid, long right, long long arr[ ], long aux[ ] ){ long i = left; long j = mid+1; long long vect[right-left+1]; long aux1[right-left+1]; int lengthaux = 0; while ( i <= mid && j <= right ){ if ( arr[i] < arr[j] ){ vect[lengthaux] = arr[i]; aux1[lengthaux] = i; i ++; lengthaux ++; } else { if ( arr[j] < arr[i] ){ vect[lengthaux] = arr[j]; aux1[lengthaux] = j; lengthaux ++; j ++; } else { vect[lengthaux] = arr[i]; aux1[lengthaux] = j; i ++; j ++; lengthaux ++; } } } while ( i <= mid ){ vect[lengthaux] = arr[i]; aux1[lengthaux] = i; i ++; lengthaux ++; } while ( j <= right ){ vect[lengthaux] = arr[j]; aux1[lengthaux] = j; j ++; lengthaux ++; } lengthaux --; for ( int i = right; i >= left; i -- ){ arr[i] = vect[lengthaux]; aux[i] = aux1[lengthaux]; lengthaux --; } } void merging ( long long arr[ ], long aux[ ], long left, long right ){ if ( left == right ) return; long mid = ( left + right )/2; merging(arr, aux, left, mid); merging( arr, aux, mid+1, right); mergeSort(left, mid, right, arr, aux); } long long findBest ( long long arr[ ], long n, long aux[ ] ){ long long best = arr[n-1] + arr[n-2] - floor( log2( (double)abs(aux[n-1] - aux[n-2]) ) ); int p = n-2; while ( p > 1 ){ if ( aux[p-1] > aux[p-2] ){ long long f = arr[p-1] + arr[p-2] - floor( log2( (double)abs(aux[p-1]- aux[p-2]) ) ); if ( f > best ){ best = f; }} p --; } return best; } int main() { long long arr[inff]; long aux[inff]; long n; readArray(n, arr); if(n!=0){ createAuxiliarArray(n, arr, aux); merging(arr, aux, 0, n-1); cout << findBest(arr, n, aux);} return 0; }