#include <cstdio>
using namespace std;
int x[100001],y[100001],arb[1<<18];
int i,j,n,t,poz,maxim,v;
int max(int a, int b){if(a>b){return a;}return b;}
int cauta(int st, int sf)
{
if(st==sf){return st;}
else{
int piv=(st+sf+1)/2;
if(y[piv]>=t){return cauta(st,piv-1);}
return cauta(piv,sf);
}
}
void sort(int st, int sf)
{
int piv=y[(st+sf)/2],i=st,j=sf,aux;
while(i<=j){
while(y[i]<piv){i++;}
while(y[j]>piv){j--;}
if(i<=j){
aux=y[i];
y[i]=y[j];
y[j]=aux;
i++;j--;
}
}
if(st<j){sort(st,j);}
if(sf>i){sort(i,sf);}
}
void query(int nod, int st, int sf)
{
if(poz>=sf){maxim=max(maxim,arb[nod]);}
else{
int piv=(st+sf)/2;
query(2*nod,st,piv);
if(piv<poz){query(2*nod+1,piv+1,sf);}
}
}
void update(int nod, int st, int sf)
{
if(st==sf){arb[nod]=v;}
else{
int piv=(st+sf)/2;
if(poz+1<=piv){update(nod*2,st,piv);}
else{update(nod*2+1,piv+1,sf);}
if(arb[nod*2]>=arb[nod*2+1]){arb[nod]=arb[nod*2];}
else{arb[nod]=arb[nod*2+1];}
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%ld",&n);
for(i=1;i<=n;i++){
scanf("%ld",&x[i]);
y[i]=x[i];
}
sort(1,n);
for(i=1;i<=n;i++){
t=x[i];
poz=cauta(0,n);
maxim=0;
if(poz){query(1,1,n);}
v=maxim+1;
update(1,1,n);
}
i=n+1;poz=n;maxim=0;query(1,1,n);printf("%ld\n",maxim);
return 0;
}