def lis(N, A):
    from bisect import bisect_left

    # dp[i] := 長さがi以下の部分列で作られる最長部分増加列の最後の要素の最小値
    dp = [-1]  # A[i] >= 0 なのでそれ以下の値を設定し、数列の単調性を保つ
    for a in A:
        if dp[-1] < a:
            dp.append(a)
        else:
            # LISテーブルが単調増加であるため、aに更新される場所は1箇所しかあり得ず、二分探索で決定できる
            idx = bisect_left(dp, a)
            dp[idx] = a
    print(len(dp) - 1)

N = int(input())
A = [int(input()) for _ in range(N)]
lis(N, A)
