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