Problem:
Score : 500 points

Problem Statement

You are given a sequence with N integers: A = \{ A_1, A_2, \cdots, A_N \}.
For each of these N integers, we will choose a color and paint the integer with that color. Here the following condition must be satisfied:

If A_i and A_j (i < j) are painted with the same color, A_i < A_j.

Find the minimum number of colors required to satisfy the condition.

Constraints

1 \leq N \leq 10^5

0 \leq A_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
A_1
:
A_N

Output

Print the minimum number of colors required to satisfy the condition.

Sample Input 1

5
2
1
4
5
3

Sample Output 1

2

We can satisfy the condition with two colors by, for example, painting 2 and 3 red and painting 1, 4, and 5 blue.

Sample Input 2

4
0
0
0
0

Sample Output 2

4

We have to paint all the integers with distinct colors.

Solution in Lua (Lua 5.3.5) (judge verdict: Time Limit Exceeded)

local function lower_bound(key,ary)
    local n=#ary
    if n==0 then
        return 1 
    end
    if key<=ary[1] then
        return 1
    end
    if key>ary[n] then
        return n+1
    end
    local min,max=1,n
    while 1<max-min do
        local mid=math.floor((min+max)/2)
        if key>ary[mid] then
            min=mid
        else
            max=mid
        end
    end
    return max
end

local n=io.read("n")
local a={}
local a_map={}
for i=1,n do
    local input=io.read("n")
    a[i]=input
    a_map[input]=(a_map[input] or 0)+1
end

local INF=math.maxinteger
local LISt={}
for i=1,n do
    LISt[i]=INF
end

local function recLIS(counter)
    local len=0
    for i=1,n do
        if a_map[a[i]]>0 then
            local k=lower_bound(a[i],LISt)
            if LISt[k]<INF then
                a_map[LISt[k]]=a_map[LISt[k]]+1
                LISt[k]=a[i]
                a_map[a[i]]=a_map[a[i]]-1
            else
                LISt[k]=a[i]
                a_map[a[i]]=a_map[a[i]]-1
            end
            len=math.max(k,len)
        end
    end
    n=n-len
    return n==0 and counter+1 or recLIS(counter+1)
end

print(recLIS(0))