#include <iostream>
using namespace std;
int n,maxchk;
int a[1000010] = {0,1,2,3,4,5,6};
int chk[1000010];
int buxiajiang(int l,int r,int tar){
	int mid;
	while (l != r + 1){
		mid = l + ((r - l) >> 1);
		if (chk[mid] < tar){
			l = tar;
		}
		else{
			r = tar;
		}
	}
	return l;
}
int main(){
	cout << buxiajiang(0,6,4);
	return 0;
}
#include <iostream>
using namespace std;
int n,maxchk;
int a[1000010];
int chk[1000010];
int buxiajiang(int l,int r,int tar){
	int mid;
	while (l != r + 1){
		mid = l + ((r - l) >> 1);
		if (chk[mid] <= tar){
			r = tar;
		}
		else{
			l = tar;
		}
	}
	return l;
}
int main(){
	while (cin >> a[++n]);
	for (int i = 1;i <= n;i++){
		int tar = buxiajiang(0,maxchk + 1,a[i]);
		chk[tar] = a[i];
		if (maxchk < tar){
			maxchk = tar;
		}
	}
	cout << maxchk;
	return 0;
}