#include <cstdio>
#include <algorithm>
using namespace std;
pair <int,int> p[100005];
int v[100005],ai[500005],rez;
void init(int poz, int st, int dr)
{
if(st==dr)
ai[poz]=v[st];
else
{
init(2*poz+1,(st+dr)/2+1,dr);
init(2*poz,st,(st+dr)/2);
ai[poz]=max(ai[poz*2],ai[poz*2+1]);
}
}
void update(int poz, int st, int dr, int loc, int x)
{
if(st==dr)
ai[poz]=x;
else
{
int mijl=(st+dr)/2;
if(loc<=mijl)
update(2*poz,st,mijl,loc,x);
else
update(2*poz+1,mijl+1,dr,loc,x);
ai[poz]=max(ai[2*poz],ai[2*poz+1]);
}
}
void maxint(int poz, int st, int dr, int a, int b)
{
if(st>=a&&dr<=b)
rez=max(rez,ai[poz]);
else
{
int mijl=(st+dr)/2;
if(b>mijl)
maxint(2*poz+1,mijl+1,dr,a,b);
if(a<=mijl)
maxint(2*poz,st,mijl,a,b);
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,x;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&p[i].first);
v[i]=p[i].first;
p[i].second=i;
}
sort(p+1,p+n+1);
int k=1;
int z=0;
while(k<=n)
{
if(p[k].first!=p[k-1].first)
++z;
v[p[k].second]=z;
++k;
}
//init(1,1,n);
for(int i=1;i<=n;++i)
{
x=v[i];
rez=0;
if(x!=1)
maxint(1,1,z,1,x-1);
else
rez=0;
int rez1=rez+1;
rez=0;
maxint(1,1,z,1,x);
int rez2=rez;
if(rez2<rez1)
{
update(1,1,z,x,rez1);
}
}
printf("%d",ai[1]);
return 0;
}