#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#pragma GCC optimize(3)
using namespace std;
int n, f[100005], g[100005], x[100005], y[100005], a[100005];
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
memset(x, 0x3f, sizeof x);
for(int i = 1; i <= n; i++){
int k = lower_bound(x + 1, x + n + 1, a[i]) - x;
x[k] = a[i];
f[i] = k;
}
memset(y, 0x3f, sizeof y);
for(int i = n; i >= 1; i--){
int k = lower_bound(y + 1, y + n + 1, a[i]) - y;
y[k] = a[i];
g[i] = k;
}
int ans = 0;
for(int i = 1; i <= n; i++){
ans = max(ans, f[i] + g[i] - 1);
}
printf("%d", ans);
return 0;
}