#include #include #include #include #include #include #include int solve(const std::vector& A){ const int n = A.size(); std::vector LiSA(n + 1, std::numeric_limits::max()); LiSA[0] = std::numeric_limits::min(); std::vector FrontLis(n); for(int i = 0; i < n; ++i){ const int idx = std::lower_bound(LiSA.cbegin(), LiSA.cend(), A[i]) - LiSA.cbegin(); LiSA[idx] = A[i]; FrontLis[i] = idx; } std::fill(LiSA.begin(), LiSA.end(), std::numeric_limits::max()); LiSA[0] = std::numeric_limits::min(); int res = 0; for(int i = n - 1; i >= 0; --i){ const int idx = std::lower_bound(LiSA.cbegin(), LiSA.cend(), A[i]) - LiSA.cbegin(); LiSA[idx] = A[i]; const int v = ((idx < FrontLis[i]) ? idx : FrontLis[i]) - 1; if(res < v) res = v; } return res; } int main(void){ std::cin.tie(nullptr); std::ios_base::sync_with_stdio(false); std::cout << std::fixed << std::setprecision(16); int n; std::cin >> n; std::vector A(n); for(int i = 0; i < n; ++i) std::cin >> A[i]; const int res1 = solve(A); for(int i = 0; i < n; ++i) A[i] = -A[i]; const int res2 = solve(A); std::cout << ((res1 < res2) ? res2 : res1) << '\n'; return 0; }