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 Haskell (GHC 7.10.3) (judge verdict: Time Limit Exceeded)


import Control.Monad
import Debug.Trace

greedy :: [Int] -> [Int] -> Int
greedy [] memo = length memo
greedy (x:xs) memo = greedy xs (bar memo x 0 (length memo )) where
  bar [] val _ _ = [val]
  bar ys val lo hi
    | last ys >= val = ys ++ [val]
    | hi < lo = take lo ys ++ [val] ++ drop (lo+1) ys
    | ys!!mid >= val = bar ys val (mid+1) hi
    | ys!!mid <  val = bar ys val lo (mid-1)
    | otherwise = take mid ys ++ [val] ++ drop (mid+1) ys
    where mid = lo + ((hi-lo) `div` 2)

binarySearch :: [Int] -> Int -> Int -> Int -> Int
binarySearch xs val lo hi
  | hi < lo = -1
  | xs!!mid > val = binarySearch xs val lo (mid-1)
  | xs!!mid < val = binarySearch xs val (mid+1) hi
  | otherwise = mid
  where mid = lo + ((hi - lo) `div` 2)

main = do
  n <- read <$> getLine :: IO Int
  ints <- replicateM n (read <$> getLine) :: IO [Int]
  print $ greedy ints []