link
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=4e5+5;
int a[N];
int b[N];
int dp[N][2];
struct tree{
int s[N];
int lowbit(int &x){
return x&(-x);
}
void update(int x,int y){
while(x<N)s[x]=max(s[x],y),x+=lowbit(x);
}
int query(int x){
int sum=0;
while(x)sum=max(sum,s[x]),x-=lowbit(x);
return sum;
}
}s0,s1;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i],b[i+n]=a[i]+1;
}
sort(b,b+1+2*n);
int len=unique(b,b+1+2*n)-b-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(b,b+1+len,a[i])-b+1;
int ans=0;
for(int i=1;i<=n;i++){
if(i>1)dp[i][1]=max(dp[i][1],s0.query(a[i]-2)+2);
dp[i][1]=max(dp[i][1],s1.query(a[i]-1)+1);
s1.update(a[i],dp[i][1]);
if(i>1)s0.update(a[i-1],dp[i-1][0]);
dp[i][0]=max(dp[i][0],s0.query(a[i]-1)+1);
ans=max(ans,max(dp[i][1],dp[i][0]));
}
cout<<ans;
}