#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], f[maxn];
int cnt;
int find(int x)
{
int low = 1, high = cnt; // 左闭右开;
while (low < high)
{
int mid = low + high >> 1;
if (f[mid] >= x)
high = mid;
else
low = mid + 1;
}
return low;
}
int main(void)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
f[++cnt] = a[1]; // 初始化起点为a[1];
for (int i = 2; i <= n; i++) // 从a数组第二个开始遍历
if (a[i] > f[cnt]) // 如果比末尾的大,则加入进去:
f[++cnt] = a[i];
else // 小于或者等于
{
// 找到第一个,大于等于当前a[i]的值;
int tmp = find(a[i]);
f[tmp] = a[i];
}
// f表示最大上升子序列;
printf("%d\n", cnt);
return 0;
}