#include #include #include using namespace std; #define rep(i,n) for(ll i=0;i> n; vector a(n); rep(i, n) cin >> a[i]; vector dp(n, INF); vector front_up(n), back_up(n); vector front_down(n), back_down(n); rep(i, n) { front_up[i] = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin() + 1; *lower_bound(dp.begin(), dp.end(), a[i]) = a[i]; } rep(i, n) dp[i] = INF; for (ll i = n - 1; i >= 0; i--) { back_up[i] = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin() + 1; *lower_bound(dp.begin(), dp.end(), a[i]) = a[i]; } rep(i, n) dp[i] = INF; rep(i, n) a[i] *= -1; rep(i, n) { front_down[i] = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin() + 1; *lower_bound(dp.begin(), dp.end(), a[i]) = a[i]; } rep(i, n) dp[i] = INF; for (ll i = n - 1; i >= 0; i--) { back_down[i] = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin() + 1; *lower_bound(dp.begin(), dp.end(), a[i]) = a[i]; } ll ans = 0; rep(i, n) { ans = max(ans, min(front_up[i] - 1, back_up[i] - 1)); ans = max(ans, min(front_down[i] - 1, back_down[i] - 1)); } cout << ans << endl; return 0; }