#include #include #include #include #include #include using namespace std; void init(int node, int beg, int end, vector& M, vector& m, const vector& n){ if (beg == end) M[node] = m[node] = n[beg]; else { init(node * 2, beg, (beg + end) / 2, M, m, n); init(node * 2 + 1,(beg + end) / 2 + 1, end, M, m, n); M[node] = max(M[2 * node], M[2 * node + 1]); m[node] = min(m[2 * node], m[2 * node + 1]); } } pair query(int node, int beg, int end, vector& M, vector& m, vector& n, int i, int j) { pair p1, p2; if (end < i || beg > j) return make_pair(-1, -1); if (beg >= i && end <= j) return make_pair(M[node], m[node]); p1 = query(2 * node, beg, (beg + end) / 2, M, m, n, i, j); p2 = query(2 * node + 1, (beg + end) / 2 + 1, end, M, m, n, i, j); if (p1 == make_pair(-1, -1)) return p2; if (p2 == make_pair(-1, -1)) return p1; pair res = make_pair(max(max(0, p1.first), max(0, p2.first)), min(max(0, p1.second), max(0, p2.second))); return res; } int main(){ /* number of elements in the sequence */ int N; cin >> N; vector n(N), m(4 * N), M(4 * N); for (int i = 0; i < N; i++) cin >> n[i]; init(1, 0, N - 1, M, m, n); int max[N][N]; int i,j; for(i=0;i < N;i++) { for(j=i;j < N;j++) { pair res = query(1, 0, N - 1, M, m, n, i, j); max[i][j] = res.first; } } int siz = (N*(N+1))/2; vector maxt(siz);int k,ind=0; for(k=0;k md(4 * siz), Md(4 * siz); init(1, 0, siz - 1, Md, md, maxt); for(i=0;i < siz;i++) { for(j=i;j < siz;j++) { pair res = query(1, 0, siz - 1, Md, md, maxt, i, j); max2[i][j] = res.first; } } for(k=0;k