// 这个是换位思考,f[i]表示长度为i的子序列最少于那个数结尾。
#include<iostream>
using namespace std;
const int N = 1e5+10;
int w[N], f[N];
int main(){
int len, n;
cin >> n;
for(int i=0; i<n; i++) cin >> w[i];
f[0] = -1e9; // 这一步很赞
len = 0;
for(int i=0; i<n; i++){
int l = 0, r = len;
while(l!=r){
int mid = l + r +1 >> 1;
if(f[mid]>w[i]){
r = mid-1;
}else{
l = mid;
}
}
len = max(len, r+1);
f[r+1] = w[i];
}
cout << len;
return 0;
}