#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,x,y) for(ll i=x;i<=y;i++)
const ll N=5e5+10;
ll n,a[N],dp[N][2],w[N],sgtr[N<<2];
ll ls(ll p) {
return p<<1;
}
ll rs(ll p) {
return p<<1|1;
}
ll pushup(ll p) {
sgtr[p]=max(sgtr[ls(p)],sgtr[rs(p)]);
}
ll query(ll p,ll l,ll r,ll ql,ll qr) {
if(qr<l||r<ql) return -1e9;
if(ql<=l&&qr>=r) return sgtr[p];
ll mid=l+r>>1,ret=-1e9;
ret=max(ret,query(ls(p),l,mid,ql,qr));
ret=max(ret,query(rs(p),mid+1,r,ql,qr));
return ret;
}
void upd(ll p,ll l,ll r,ll ql,ll v) {
if(ql<l||ql>r) return;
if(l==r) sgtr[p]=max(sgtr[p],v);
else {
ll mid=l+r>>1;
if(ql<=mid) upd(ls(p),l,mid,ql,v);
else upd(rs(p),mid+1,r,ql,v);
pushup(p);
}
}
int main() {
cin>>n;
rep(i,1,n) cin>>a[i];
memset(w,-0x5f,sizeof(w));
rep(i,1,n) {
dp[i][0]=max(dp[i][0],w[a[i]]+1);
dp[i][1]=max(dp[i][1],max(query(1,1,N-10,1,a[i]-1),query(1,1,N-10,a[i]+1,N-10))+1);
w[a[i]]=max(w[a[i]],dp[i][1]);
upd(1,1,N-10,a[i],dp[i][0]);
}
ll ans=0;
rep(i,1,n) {
ans=max(ans,dp[i][0]);
}
cout<<ans;
}