#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2000000000
#define MaxN 100005
#define MaxT 265000
using namespace std;
FILE *IN,*OUT;
int N,v[MaxN],T[MaxT],Max=0,Pos,X,Val,S=0;
struct _Norm
{
int val,pos;
}p[MaxN];
bool cond(_Norm a,_Norm b)
{
return a.val<b.val;
}
inline void Update(int node,int start,int end)
{
int mid;
while(start!=end)
{
mid=(start+end)>>1;
if(Pos>mid)start=mid+1,node=(node<<1)+1;
else end=mid,node<<=1;
}
T[node]=X;
node>>=1;
while(node)
{
T[node]=max(T[node<<1],T[(node<<1)+1]);
node>>=1;
}
}
void Query(int node,int start,int end)
{
if(Pos==1)
return;
else if(end<Pos)
{
Val=max(Val,T[node]);
}
else
{
int mid=(start+end)>>1;
Query(node<<1,start,mid);
if(Pos-1>mid)Query((node<<1)+1,mid+1,end);
}
}
int main()
{
IN=fopen("scmax.in","r");
OUT=fopen("scmax.out","w");
fscanf(IN,"%d",&N);
for(int i=1;i<=N;i++)
fscanf(IN,"%d",&v[i]),p[i].pos=i,p[i].val=v[i];
sort(p+1,p+1+N,cond);
for(int i=1;i<=N;i++)
{
if(p[i-1].val!=p[i].val)S++;
v[p[i].pos]=S;
}
for(int i=1;i<=N;i++)
{
Pos=v[i];
Val=0;
Query(1,1,N);
X=1+Val;
Max=max(Max,X);
Update(1,1,N);
}
fprintf(OUT,"%d",Max);
return 0;
}