#include #include #include using namespace std; #define MAX 100100 struct Prvek { int h; int index; bool operator<(const Prvek &p) const { return (hp.index)); } }; int N; Prvek seq[MAX]; // Posloupnost Prvek sorted[MAX]; // Setříděná posloupnost int prefix[MAX]; // Délky končících prefixů int sufix[MAX]; // Délky začínajících sufixů int tree[4*MAX]; // Intervalový strom int TN; // Počet listů ve stromě void tree_inic() { TN = N; int listy = 1; while (listy0) { tree[k] = max(tree[2*k], tree[2*k+1]); k /= 2; } } int maximum(int A, int B) { int ret = 0; int a = TN + A -1; int b = TN + B + 1; while (a!=b && (a^1)!=b) { if (a%2==0) ret = max(ret, tree[a^1]); if (b%2==1) ret = max(ret, tree[b^1]); a /= 2; b /= 2; } return ret; } int main() { // Načtení vstupu -- indexujeme od 1 scanf("%d", &N); for (int i=1; i<=N; i++) { scanf("%d", &seq[i].h); seq[i].index = i; sorted[i] = seq[i]; } sort(&sorted[1], &sorted[N+1]); // Prefixy a sufixy prefix[1] = 1; for (int i=2; i<=N; i++) { if (seq[i].h>seq[i-1].h) prefix[i] = prefix[i-1]+1; else prefix[i] = 1; } sufix[N] = 1; for (int i=N-1; i>=1; i--) { if (seq[i].h