RT WA*2
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 410000
int t,n,a[N],ans,f[N],g[N],c1[N],c2[N],minn1[N],minn2[N],flag1[N],flag2[N],pre;
pair<int,int> fr[N],ba[N];
map<int,int> mp,to;
map<pair<int,int>,int> cnt;
inline int lowbit(int x){
return x&(-x);
}
void add1(int x,int k){
int pre=x;
while(x<=N-1){
if(k>c1[x]){
c1[x]=k;
minn1[x]=pre;
}
else if(k==c1[x]){
minn1[x]=min(minn1[x],pre);
}
x+=lowbit(x);
}
return ;
}
pair<int,int> query1(int x){
int ans=0,t=1e18;
while(x){
if(c1[x]>ans){
ans=c1[x];
t=minn1[x];
}
else if(c1[x]==ans){
t=min(t,minn1[x]);
}
x-=lowbit(x);
}
return make_pair(ans,t);
}
void add2(int x,int k){
int pre=x;
while(x<=N-1){
if(k>c2[x]){
c2[x]=k;
minn2[x]=pre;
}
else if(k==c2[x]){
minn2[x]=min(minn2[x],pre);
}
x+=lowbit(x);
}
return ;
}
pair<int,int> query2(int x){
int ans=0,t=1e18;
while(x){
if(c2[x]>ans){
ans=c2[x];
t=minn2[x];
}
else if(c2[x]==ans){
t=min(t,minn2[x]);
}
x-=lowbit(x);
}
return make_pair(ans,t);
}
signed main(){
memset(minn1,0x3f3f3f,sizeof(minn1));
memset(minn2,0x3f3f3f,sizeof(minn2));
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]=1;
}
int cnt1=0;
pre=-(long long)1e9;
for(auto x:mp){
if(x.first-pre==1){
cnt1++;
}
else{
cnt1+=2;
}
pre=x.first;
to[x.first]=cnt1;
}
for(int i=1;i<=n;i++){
a[i]=to[a[i]];
}
for(int i=1;i<=n;i++){
pair<int,int> t=query1(a[i]-1);
if(cnt[t]!=i-1){
flag1[i]=1;
}
t.first++;
if(cnt[make_pair(t.first,a[i])]==0){
cnt[make_pair(t.first,a[i])]=i;
}
fr[i]=t;
f[i]=t.first;
ans=max(ans,f[i]);
add1(a[i],f[i]);
}
cnt.clear();
cnt[make_pair(0,1e18)]=n+1;
for(int i=n;i>=1;i--){
pair<int,int> t=query2(N-a[i]);
if(cnt[t]!=i+1){
flag2[i]=1;
}
t.first++;
if(cnt[make_pair(t.first,N-a[i]+1)]==0){
cnt[make_pair(t.first,N-a[i]+1)]=i;
}
ba[i]=t;
g[i]=t.first;
add2(N-a[i]+1,g[i]);
}
ans=max(f[n-1],g[2])+1;
for(int i=2;i<=n-1;i++){
if((fr[i].second<=a[i]-2&&flag1[i])||(N+1-ba[i].second>=a[i]+2&&flag2[i])){
ans=max(ans,fr[i].first+ba[i].first);
}
else{
ans=max(ans,fr[i].first+ba[i].first-1);
}
}
cout<<ans<<endl;
return 0;
}