# include <bits/stdc++.h>
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
const int N = 100005;
int n;
int t[4*N];
int dp[N];
int res;
struct cop{
int val, id;
} b[N];
bool cmp(cop a, cop b) { return a.val < b.val; }
int a[N], rm[N];
void update(int nod,int l, int r, int pos, int val)
{
if (l == r) {
t[nod] = max(t[nod], val);
return;
}
int m = (l+r)/2;
if (pos <= m) update(2*nod, l,m,pos,val);
else update(2*nod+1,m+1,r,pos,val);
t[nod] = max(t[nod*2], t[nod*2+1]);
}
int get_max(int nod, int l, int r, int a, int b)
{
if (a==l && r==b) return t[nod];
int m=(l+r)/2;
if (b<=m) return get_max(2*nod,l,m,a,b);
if (a>m) return get_max(2*nod+1,m+1,r,a,b);
return max(get_max(2*nod,l,m,a,m), get_max(2*nod+1,m+1,r,m+1,b));
}
int main()
{
fi>>n;
for (int i=1;i<=n;i++) fi>>a[i], b[i].val = a[i], b[i].id = i;
sort(b+1,b+n+1, cmp);
int k = 0;
for (int i=1;i<=n;i++)
{
if (b[i].val != b[i-1].val) k++;
a[b[i].id] = k;
rm[k] = b[i].val;
}
for (int i=1;i<=n;i++)
{
dp[i] = get_max(1,0,n,0,a[i]-1) + 1;
update(1,0,n,a[i],dp[i]);
res = max(res, dp[i]);
}
fo << res;
return 0;
}