#include <algorithm>
#include <climits>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;cin>>n;
vector<int> nums(n);
for(int i=0;i<n;i++)
{
cin>>nums[i];
}
//经典动态规划 复杂度O(n^2)
/*
vector<int> dp(n,1);
int max_len=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(nums[j]<=nums[i])
{
dp[i] = max(dp[i],dp[j]+1);
}
}
max_len = max(max_len,dp[i]);
}
cout<<max_len<<endl;
*/
//贪心+二分
//d[i]表示长度为i的不下降子序列的最后一个元素的最小值
vector<int> d;
for(int i=0;i<n;i++)
{
//在d中寻找第一个>nums[i]的位置
auto it = upper_bound(d.begin(), d.end(), nums[i]);
if(it == d.end())
{
d.push_back(nums[i]);
}
else
{
//替换掉第一个比nums[i]大的元素
*it = nums[i];
}
}
cout<<d.size()<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")