#include using namespace std; #define MAX 1000000007 int maxVal(int x, int y) { return (x > y)? x: y; } int getMid(int s, int e) { return s + (e -s)/2; } int RMQUtil(int *st, int ss, int se, int qs, int qe, int index) { if (qs <= ss && qe >= se) return st[index]; if (se < qs || ss > qe) return INT_MIN; int mid = getMid(ss, se); return maxVal(RMQUtil(st, ss, mid, qs, qe, 2*index+1), RMQUtil(st, mid+1, se, qs, qe, 2*index+2)); } int RMQ(int *st, int n, int qs, int qe) { if (qs < 0 || qe > n-1 || qs > qe) { return -1; } return RMQUtil(st, 0, n-1, qs, qe, 0); } int constructSTUtil(vector& arr, int ss, int se, int *st, int si) { if (ss == se) { st[si] = arr[ss]; return arr[ss]; } int mid = getMid(ss, se); st[si] = maxVal(constructSTUtil(arr, ss, mid, st, si*2+1), constructSTUtil(arr, mid+1, se, st, si*2+2)); return st[si]; } double Log2( double n ) { return log(n) / log(2.0); } int *constructST(vector& arr, int n) { int x = (int)(ceil(Log2(n))); int max_size = 2*(int)pow(2.0, x) - 1; int *st = new int[max_size]; constructSTUtil(arr, 0, n-1, st, 0); return st; } vector maxTransform(vector A) { int n = A.size(); int j = 0, m = 0; vector b; int* st = constructST(A, n); for(int k=0;k<=n-1;k++) { for(int i=0;i<=n-k-1;i++) { j = i+k; m = RMQ(st, n, i, j); b.push_back(m); } } return b; } int solve(vector A) { vector ans = maxTransform(maxTransform(A)); int sum = 0; for(long i=0;i> n; vector a(n); for(int a_i = 0; a_i < n; a_i++){ cin >> a[a_i]; } int result = solve(a); cout << result << endl; return 0; }