#include <stdio.h>
#include <algorithm>
#define NMAX 200023
FILE *fin, *fout;
int max(int a, int b)
{
return (a>b)?a:b;
}
struct num
{
int val;
int poz;
} v[NMAX];
int n, v1[NMAX], arb[NMAX];
bool cmp(num a, num b)
{
return (a.val < b.val);
}
int interogare(int st, int dr, int st1, int dr1, int nod)
{
if(st == st1 && dr == dr1) return arb[nod];
int mij = (st + dr)/2;
if(st1 > mij) return interogare(mij+1, dr, st1, dr1, 2*nod+1);
if(dr1 <= mij) return interogare(st, mij, st1, dr1, 2*nod);
return max(interogare(mij+1, dr, mij+1, dr1, 2*nod+1), interogare(st, mij, st1, mij, 2*nod));
}
void pun(int st, int dr, int val, int nod)
{
if(st == dr)
{
if(st == 1) arb[nod] = 1;
else arb[nod] = interogare(1, n, 1, st-1, 1) + 1;
return;
}
int mij = (st+dr)/2;
if(val > mij) pun(mij+1, dr, val, 2*nod+1);
if(val <= mij) pun(st, mij, val, 2*nod);
arb[nod] = max(arb[2*nod], arb[2*nod+1]);
}
int main()
{
fin = fopen("scmax.in", "r");
fout = fopen("scmax.out", "w");
fscanf(fin, "%d", &n);
for(int i =1; i<= n; i++)
{
fscanf(fin, "%d", &v[i].val);
v[i].poz = i;
}
std::sort(v+1, v+n+1, cmp);
int temp = 0;
for(int i =1; i<= n; i++)
{
if(i>1 && v[i].val == v[i-1].val) temp ++;
v1[v[i].poz] = i - temp;
}
for(int i = 1; i<= n; i++)
{
pun(1, n, v1[i], 1);
}
fprintf(fout, "%d\n", arb[1]);
fclose(fin);
fclose(fout);
return 0;
}