#include #define rep(i,n) for(int i = 0; i < (n); ++i) #define rrep(i,n) for(int i = 1; i <= (n); ++i) #define drep(i,n) for(int i = (n)-1; i >= 0; --i) #define srep(i,s,t) for (int i = s; i < t; ++i) using namespace std; typedef pair P; typedef long long int ll; #define dame { puts("-1"); return 0;} #define yn {puts("Yes");}else{puts("No");} const int MAX_N = 1001001; const int INF = 1001001001; int n; int a[MAX_N]; int dp[MAX_N]; int l[MAX_N], r[MAX_N]; int main() { cin >> n; rep(i,n){ cin >> a[i]; } fill(dp, dp+n, 0); drep(i,n){ auto ite = lower_bound(dp, dp+n, a[i]+1); r[i] = n - (ite - dp); ite--; *ite = a[i]; } rep(i,n)dp[i] = 0; rep(i,n){ auto ite = lower_bound(dp, dp+n, a[i]+1); l[i] = n - (ite - dp); ite--; *ite = a[i]; } int ans = 0; rep(i,n){ ans = max(ans,min(l[i],r[i])); } rep(i,n)a[i] = INF - a[i]; fill(dp, dp+n, 0); drep(i,n){ auto ite = lower_bound(dp, dp+n, a[i]+1); r[i] = n - (ite - dp); ite--; *ite = a[i]; } rep(i,n)dp[i] = 0; rep(i,n){ auto ite = lower_bound(dp, dp+n, a[i]+1); l[i] = n - (ite - dp); ite--; *ite = a[i]; } rep(i,n){ ans = max(ans,min(l[i],r[i])); } cout << ans << endl; return 0; }