#include #include #include #include #include #include #include #include #include using namespace std; #pragma warning (disable: 4996) int N, A[1 << 20]; int dp[1 << 20]; int cl[1 << 20], cr[1 << 20]; int dl[1 << 20], dr[1 << 20]; vector solve(vector vec) { int cnt = 0; vector res; for (int i = 0; i < N; i++) dp[i] = 0; for (int i = 0; i < vec.size(); i++) { int pos1 = lower_bound(dp, dp + cnt, vec[i]) - dp; dp[pos1] = vec[i]; if (pos1 == cnt) cnt++; res.push_back(pos1 + 1); } return res; } int main() { cin >> N; for (int i = 1; i <= N; i++) cin >> A[i]; vector vec1, vec2; for (int i = 1; i <= N; i++) vec1.push_back(A[i]); vector c1 = solve(vec1); reverse(vec1.begin(), vec1.end()); vector c2 = solve(vec1); reverse(c2.begin(), c2.end()); for (int i = 1; i <= N; i++) vec2.push_back(-A[i]); vector c3 = solve(vec2); reverse(vec2.begin(), vec2.end()); vector c4 = solve(vec2); reverse(c4.begin(), c4.end()); for (int i = 1; i <= N; i++) cl[i] = c1[i - 1]; for (int i = 1; i <= N; i++) cr[i] = c2[i - 1]; for (int i = 1; i <= N; i++) dl[i] = c3[i - 1]; for (int i = 1; i <= N; i++) dr[i] = c4[i - 1]; int maxn = 0; for (int i = 1; i <= N; i++) { maxn = max(maxn, min(cl[i], cr[i])); maxn = max(maxn, min(dl[i], dr[i])); } cout << maxn - 1 << endl; return 0; }