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