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 C (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int N;
int *A;
int *color;

int main(int argc, char *argv[]) {
	int sr;
	int i, j;
	int c;
	int cv;

	sr=scanf("%d", &N);

	A = (int *)malloc(sizeof(int)*N);
	color = (int *)malloc(sizeof(int)*N);

	for (i=0; i<N; i++) {
		sr=scanf("%d", A+i);
	}
	memset(color, 0, sizeof(int)*N);

	c = 1;
	for (i=0; i<N; i++) {
		if (*(color+i) != 0) continue;
		*(color+i) = c;
		cv = *(A+i);
//fprintf(stderr, "%d(%d) ", *(A+i), i);
		for (j=i+1; j<N; j++) {
			if (*(color+j) != 0) continue;
			if (*(A+j) <= cv) continue;
			*(color+j) = c;
			cv = *(A+j);
//fprintf(stderr, "%d(%d) ", *(A+j), j);
		}
//fprintf(stderr, " (%d)\n", c);
		c++;
	}

	printf("%d\n", c-1);

	return 0;

}

/*
問題文
N
 個の空の箱が横一列に並んでいます。 左から 
i (1≦i≦N) 番目の箱には整数 i が書かれています。

すぬけさんは、それぞれの箱に対してボールを 1 個入れるか何も入れないかを選ぶことができます。

ここで、以下の条件を満たすようなボールの入れ方を、いいボールの入れ方と定めます。

	・1 以上 N 以下の任意の整数 i について、 i の倍数が書かれた箱に入っているボールの個数の和を 2 で割った余りが a_i である。
いいボールの入れ方は存在するでしょうか。存在するならば 1 つ求めてください。

制約
・入力は全て整数である。
・1≦N≦2 × 10^5
・a_i は 0 または 1 である。


N/2番目以降の箱のボールの数はa_i（その箱より大きい倍数の箱はないから)
i番目の箱の数は、iより大きい倍数の箱のボールの和が偶数なら0、奇数なら1

N/2以上の箱のボールの数によって、i≦N/2番目までのボールの和が決まる。

A_i: i番目の箱に入っているボールの数
A_i = a_i (i≧N/2)

A_i+A_2i+A_3i+...+A_(k-1)i+a_ki
*/