/*
1.只需保留每条路序号最小的
*/
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int N,cnt=0;
cin>>N;
int array[N];
int b[N];
fill(b,b+N,999999);//初始化
for(int i=0;i<N;i++)
cin>>array[i];
for(int i=0;i<N;i++)
{
int t=upper_bound(b,b+cnt,array[i])-b; //在已经用了的通道中查找是否有比array[i]大的,若没有重开一条
if(b[t]>array[i])
b[t]=array[i];
else
b[++cnt]=array[i];
}
cout << cnt+1 << endl;
return 0;
}