#2.使用二分查找,动态构建一个辅助数组 res 来记录当前能够构成的上升子序列的“最小末尾元素”
import sys
from bisect import bisect_left

n=int(sys.stdin.readline())
a=[int(x) for x in sys.stdin.readline().split()]
res=[]

for x in a:
    i=bisect_left(res,x)#返回的是 第一个不小于 x 的位置。如果 x 已经在数组中,它返回 x 第一个出现的位置
    if i==len(res):#比res最后一个元素还大
        res.append(x)
    else:
        res[i]=x
print(len(res))


#1.dp求解
# import sys

# def longest_inc_seq():
#     n=int(sys.stdin.readline())
#     a=[int(x) for x in sys.stdin.readline().split()]
    
#     if n<=1:
#         return n

#     dp=[1]*n
#     for i in range(n):
#         for j in range(i):
#             if a[i]>a[j]:
#                 dp[i]=max(dp[i],dp[j]+1)

#     return max(dp)
# print(longest_inc_seq())