#include
using namespace std;
#define LL long long
const int inf = 0x3f3f3f3f;
const int N = 100005;
int dp[N],a[N],b[N];
int t[N*4];
int n;
void upd(int rt,int l,int r,int pos,int val)
{
if(l==r)
{
t[rt]=val;
return ;
}
int m=(l+r)>>1;
if(pos<=m) upd(rt<<1,l,m,pos,val);
else upd(rt<<1|1,m+1,r,pos,val);
t[rt]=max(t[rt<<1],t[rt<<1|1]);
}
int ask(int rt,int l,int r,int ql,int qr)
{
if(l>=ql && r<=qr)
{
return t[rt];
}
int m=(l+r)>>1;
int q1=0;
int q2=0;
if(ql<=m) q1=ask(rt<<1,l,m,ql,qr);
if(qr>m) q2=ask(rt<<1|1,m+1,r,ql,qr);
return max(q1,q2);
}
void cdq(int l,int r)
{
if(l>=r) return ;
int m=(l+r)>>1;
cdq(l,m);
for(int i=l;i<=m;i++)upd(1,1,n,a[i],dp[i]);
for(int j=m+1;j<=r;j++)
{
dp[j]=max(dp[j],ask(1,1,n,1,a[j])+1);
}
for(int i=l;i<=m;i++)upd(1,1,n,a[i],0);
cdq(m+1,r);
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)scanf("%d",&a[i]),dp[i]=1;
cdq(1,n);
cout<<*max_element(dp+1,dp+1+n)<