#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int n;
int a[50005];
int g[50005];//g[i]表示长度为i的上升子序列的末尾数字
//如果有多个就表示最小的那个
int len;//当前最长上升子序列的长度
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
g[1]=a[1];
len=1;
int j;
for(int i=2;i<=n;i++){
if(g[len]<a[i]){
j=++len;
}
else{
j=lower_bound(g+1,g+1+len,a[i])-g;//找到g中第一个比a[i]小的数
}
g[j]=a[i];
}
printf("%d",len);
return 0;
}