//Szymon Januszek 3LO #include <bits/stdc++.h> using namespace std; int ocen[1000005]; int b_tree[3000000], e_tree[3000000]; int tree_size; int find(const int *tree, int n, int x) { if(n >= tree_size) return n - tree_size; if(tree[2*n] >= x) return find(tree, 2*n, x); if(tree[2*n + 1] >= x) return find(tree, 2*n + 1, x); return -1; } void add_point_tree(int *tree, int n, int v) { tree[n] = v; while((n >>= 1)) tree[n] = max(tree[2*n], tree[(2*n) + 1]); } int getInt() { char c = getchar_unlocked(); int w = 0; while(c < '0' && c != '-') c = getchar_unlocked(); while(c >= '0') { w *= 10; w += c - '0'; c = getchar_unlocked(); } return w; } int main() { int n; cin >> n; tree_size = 1 << (int)ceil(log2(n + 2)); for(int i = 0; i < n; i++) ocen[i] = getInt();//scanf("%d", ocen + i); cout << (2*n + 1) << " "; for(int i = 0; i < n; i++) { b_tree[tree_size + i] = n + 1; e_tree[tree_size + i] = n + 1; } for(int i = tree_size - 1; i > 0; i--) { b_tree[i] = max(b_tree[2*i], b_tree[(2*i) + 1]); e_tree[i] = max(e_tree[2*i], e_tree[2*i + 1]); } int64_t w = 2; for(int i = n + 2; i < 2*n; i++) { int k = i - n - 1; add_point_tree(b_tree, tree_size + k - 1, ocen[k - 1]); add_point_tree(e_tree, tree_size + k - 1, ocen[n - k]); int len = max(find(b_tree, 1, i >> 1), 0); len += max(find(e_tree, 1, i >> 1), 0); w += max(len - k + 1, 0); } cout << w << endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | //Szymon Januszek 3LO #include <bits/stdc++.h> using namespace std; int ocen[1000005]; int b_tree[3000000], e_tree[3000000]; int tree_size; int find(const int *tree, int n, int x) { if(n >= tree_size) return n - tree_size; if(tree[2*n] >= x) return find(tree, 2*n, x); if(tree[2*n + 1] >= x) return find(tree, 2*n + 1, x); return -1; } void add_point_tree(int *tree, int n, int v) { tree[n] = v; while((n >>= 1)) tree[n] = max(tree[2*n], tree[(2*n) + 1]); } int getInt() { char c = getchar_unlocked(); int w = 0; while(c < '0' && c != '-') c = getchar_unlocked(); while(c >= '0') { w *= 10; w += c - '0'; c = getchar_unlocked(); } return w; } int main() { int n; cin >> n; tree_size = 1 << (int)ceil(log2(n + 2)); for(int i = 0; i < n; i++) ocen[i] = getInt();//scanf("%d", ocen + i); cout << (2*n + 1) << " "; for(int i = 0; i < n; i++) { b_tree[tree_size + i] = n + 1; e_tree[tree_size + i] = n + 1; } for(int i = tree_size - 1; i > 0; i--) { b_tree[i] = max(b_tree[2*i], b_tree[(2*i) + 1]); e_tree[i] = max(e_tree[2*i], e_tree[2*i + 1]); } int64_t w = 2; for(int i = n + 2; i < 2*n; i++) { int k = i - n - 1; add_point_tree(b_tree, tree_size + k - 1, ocen[k - 1]); add_point_tree(e_tree, tree_size + k - 1, ocen[n - k]); int len = max(find(b_tree, 1, i >> 1), 0); len += max(find(e_tree, 1, i >> 1), 0); w += max(len - k + 1, 0); } cout << w << endl; return 0; } |