#include using namespace std; const int M=1E9+7; vector tree; vector arr; int func(int n1, int n2) { return max(n1,n2); } void build(int node, int inicio, int fin) { if(inicio > fin) return; else if(inicio == fin) {tree[node] = arr[inicio]; return;} int node2 = node + node + 1; int mid = (inicio + fin) / 2 ; build(node2, inicio, mid); build(node2 + 1, mid+1, fin); tree[node] = func(tree[node2], tree[node2 + 1]); /// elegir qué función se usa } /// without Lazy /// se usa la función func y el update se produce reemplazando por el valor val void updateRange(int node, int inicio, int fin, int l, int r, int val) { if(inicio > fin || inicio > r || fin < l) return; if(inicio == fin) { tree[node] = val; return; } int node2 = node + node + 1; int mid = (inicio + fin) / 2; updateRange(node2, inicio, mid, l, r, val); updateRange(node2 + 1, mid + 1, fin, l, r, val); tree[node] = func(tree[node2], tree[node2 + 1]); } /// without Lazy /// se usa la función func int query(int node, int inicio, int fin, int l, int r) { if(r < inicio or fin < l) return 0; if(l <= inicio and fin <= r) return tree[node]; int mid = (inicio + fin) / 2; int node2 = node + node + 1; int p1 = query(node2, inicio, mid, l, r); int p2 = query(node2 + 1, mid + 1, fin, l, r); return func(p1, p2); } int solve(vector &A,int it=0) { int n=A.size(); arr = A; tree.resize(3*n,0); build(0,0,n); A.clear(); for (int k=0;k> 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; }