from bisect import bisect_left

from collections import deque



n = int(eval(input()))

a = [int(eval(input())) for _ in range(n)]



q = deque([-1])

for x in a:

    insert_pos = bisect_left(q, x) - 1

    # bisect_left[0,len(lis)] == 以上の最小

    # 手前は未満の最大[-1,len(lis))

    if insert_pos == -1:

        q.appendleft(x)

    else:

        q[insert_pos] = x



ret = len(q)



print(ret)



# 最小パス被覆

# LDS最長減少部分列

# 解説放送

# dilworthの定理

# パスを通してどの2点間も移動できないような点集合の点の個数 = 最小パス被覆

# 移動できないような点は

# 右側（大きい値側）から見て以上になっているような数列



from bisect import bisect_right



inf = 10 ** 9 + 1



n = int(eval(input()))

a = [int(eval(input())) for _ in range(n)]



t = [inf]

for x in reversed(a):

    if t[-1] <= x:

        t.append(x)

    else:

        insert_pos = bisect_right(t, x)

        t[insert_pos] = x



ret = len(t)



print(ret)

from bisect import bisect_left
from collections import deque

n = int(eval(input()))
a = [int(eval(input())) for _ in range(n)]
q = deque([-1])
for x in a:
    insert_pos = bisect_left(q, x) - 1
    # bisect_left[0,len(lis)] == 以上の最小
    # 手前は未満の最大[-1,len(lis))
    if insert_pos == -1:
        q.appendleft(x)
    else:
        q[insert_pos] = x
ret = len(q)
print(ret)
# 最小パス被覆

# LDS最長減少部分列
# 解説放送
# dilworthの定理
# パスを通してどの2点間も移動できないような点集合の点の個数 = 最小パス被覆
# 移動できないような点は
# 右側（大きい値側）から見て以上になっているような数列
from bisect import bisect_right

inf = 10**9 + 1
n = int(eval(input()))
a = [int(eval(input())) for _ in range(n)]
t = [inf]
for x in reversed(a):
    if t[-1] <= x:
        t.append(x)
    else:
        insert_pos = bisect_right(t, x)
        t[insert_pos] = x
ret = len(t)
print(ret)

-from bisect import bisect_left -from collections import deque +# LDS最長減少部分列 +# 解説放送 +# dilworthの定理 +# パスを通してどの2点間も移動できないような点集合の点の個数 = 最小パス被覆 +# 移動できないような点は +# 右側（大きい値側）から見て以上になっているような数列 +from bisect import bisect_right +inf = 10**9 + 1 -q = deque([-1]) -for x in a: -    insert_pos = bisect_left(q, x) - 1 -    # bisect_left[0,len(lis)] == 以上の最小 -    # 手前は未満の最大[-1,len(lis)) -    if insert_pos == -1: -        q.appendleft(x) +t = [inf] +for x in reversed(a): +    if t[-1] <= x: +        t.append(x) -        q[insert_pos] = x -ret = len(q) +        insert_pos = bisect_right(t, x) +        t[insert_pos] = x +ret = len(t) -# 最小パス被覆