#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")