#include <stdio.h>
#include <algorithm>
using namespace std;
int a[262145],v[100001],v2[100001],ind[100001],n,aux,c,x=1;
int cmp(int i,int j)
{
return v[i]<v[j];
}
int max(int i,int j)
{
if (i>=j) return i;
return j;
}
int query(int nod,int s,int d,int l,int r)
{
if ((d<l)||(s>r)) return 0;
if ((l<=s)&&(d<=r)) return v[nod];
int a,b;
a=query(2*nod,s,(s+d)/2,l,r);
b=query(2*nod+1,(s+d)/2+1,d,l,r);
if (a>=b) return a;
return b;
}
int main()
{
int i,j;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;++i)
{
scanf("%d",&v2[i]);
v[i]=v2[i];
ind[i]=i;
}
sort(ind+1,ind+n+1,cmp);
i=1;
while (i<=n)
{
aux=i;
while ((i<=n)&&(v[ind[i]]==v[ind[i+1]])) ++i;
++c;
for (j=aux;j<=i;++j) v[ind[j]]=c;
++i;
}
while (x<c) x*=2;
for (i=1;i<=n;++i)
{
aux=query(1,1,x,1,v[i]-1);
a[x-1+i]=aux+1;
for (j=(x-1+v[i])/2;j>0;j/=2) {a[j]=a[2*j];if (a[j]<a[2*j+1]) a[j]=a[2*j+1];}
}
printf("%d",a[1]);
return 0;
}