#include #include #include using namespace std; const int INF = (1<<31)-1; vector a, tree; int N, pos, Solution; void Prepare(); void Solve(); void Write(); int Query(int node, int left, int right, int a, int b); int main() { Prepare(); Solve(); Write(); return 0; } int Query(int node, int left, int right, int a, int b) { int ans = -INF; if( ( a <= left && right <= b ) || left == right) return tree[node]; int mid = (left + right) >> 1; if(a <= mid) ans = max(ans, Query(node<<1, left, mid, a, b) ); if(b > mid) ans = max(ans, Query((node<<1) + 1, mid+1, right, a, b) ); return ans; } void Build(int node, int left, int right) { if(left == right) { tree[node] = a[left]; return; } int mid = (left+right) >> 1; Build(node<<1, left, mid); Build( (node<<1) + 1, mid+1, right); tree[node] = max(tree[node<<1], tree[(node<<1)+1]); } void Solve() { int val; for(int i=1; i<=N; ++i) { scanf("%d", &val); a.push_back(val); } Build(1, 1, N); Solution = -INF; for(pos=1; pos