#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 1e6 + 5;
long long n;
long long a[MaxN], b[MaxN];
long long tree[4 * MaxN];
void input()
{
cin >> n;
for (long long i = 1; i <= n; i++)
cin >> a[i];
}
void update(long long id, long long l, long long r, long long pos, long long val)
{
if (l == r)
{
tree[id] = max(tree[id], val);
return;
}
long long mid = (l + r) / 2;
if (pos <= mid)
update(id * 2, l, mid, pos, val);
else
update(id * 2 + 1, mid + 1, r, pos, val);
tree[id] = max(tree[id * 2], tree[id * 2 + 1]);
}
long long query(long long id, long long l, long long r, long long u, long long v)
{
if (v < l || r < u)
return 0;
if (u <= l && r <= v)
return tree[id];
long long mid = (l + r) / 2;
return max(query(id * 2, l, mid, u, v),
query(id * 2 + 1, mid + 1, r, u, v));
}
void solve()
{
for (long long i = 1; i <= n; i++)
b[i] = a[i];
sort(b + 1, b + n + 1);
long long sz = unique(b + 1, b + n + 1) - b - 1;
long long ans = 1;
for (long long i = 1; i <= n; i++)
{
long long pos = lower_bound(b + 1, b + sz + 1, a[i]) - b;
long long cur;
if (pos == 1)
cur = 1;
else
cur = query(1, 1, sz, 1, pos - 1) + 1;
update(1, 1, sz, pos, cur);
ans = max(ans, cur);
}
cout << ans;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
input();
solve();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGxvbmcgbG9uZyBNYXhOID0gMWU2ICsgNTsKCmxvbmcgbG9uZyBuOwpsb25nIGxvbmcgYVtNYXhOXSwgYltNYXhOXTsKbG9uZyBsb25nIHRyZWVbNCAqIE1heE5dOwoKdm9pZCBpbnB1dCgpCnsKICAgIGNpbiA+PiBuOwogICAgZm9yIChsb25nIGxvbmcgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgIGNpbiA+PiBhW2ldOwp9Cgp2b2lkIHVwZGF0ZShsb25nIGxvbmcgaWQsIGxvbmcgbG9uZyBsLCBsb25nIGxvbmcgciwgbG9uZyBsb25nIHBvcywgbG9uZyBsb25nIHZhbCkKewogICAgaWYgKGwgPT0gcikKICAgIHsKICAgICAgICB0cmVlW2lkXSA9IG1heCh0cmVlW2lkXSwgdmFsKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbG9uZyBsb25nIG1pZCA9IChsICsgcikgLyAyOwoKICAgIGlmIChwb3MgPD0gbWlkKQogICAgICAgIHVwZGF0ZShpZCAqIDIsIGwsIG1pZCwgcG9zLCB2YWwpOwogICAgZWxzZQogICAgICAgIHVwZGF0ZShpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCBwb3MsIHZhbCk7CgogICAgdHJlZVtpZF0gPSBtYXgodHJlZVtpZCAqIDJdLCB0cmVlW2lkICogMiArIDFdKTsKfQoKbG9uZyBsb25nIHF1ZXJ5KGxvbmcgbG9uZyBpZCwgbG9uZyBsb25nIGwsIGxvbmcgbG9uZyByLCBsb25nIGxvbmcgdSwgbG9uZyBsb25nIHYpCnsKICAgIGlmICh2IDwgbCB8fCByIDwgdSkKICAgICAgICByZXR1cm4gMDsKCiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikKICAgICAgICByZXR1cm4gdHJlZVtpZF07CgogICAgbG9uZyBsb25nIG1pZCA9IChsICsgcikgLyAyOwoKICAgIHJldHVybiBtYXgocXVlcnkoaWQgKiAyLCBsLCBtaWQsIHUsIHYpLAogICAgICAgICAgICAgICBxdWVyeShpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2KSk7Cn0KCnZvaWQgc29sdmUoKQp7CiAgICBmb3IgKGxvbmcgbG9uZyBpID0gMTsgaSA8PSBuOyBpKyspCiAgICAgICAgYltpXSA9IGFbaV07CgogICAgc29ydChiICsgMSwgYiArIG4gKyAxKTsKCiAgICBsb25nIGxvbmcgc3ogPSB1bmlxdWUoYiArIDEsIGIgKyBuICsgMSkgLSBiIC0gMTsKCiAgICBsb25nIGxvbmcgYW5zID0gMTsKCiAgICBmb3IgKGxvbmcgbG9uZyBpID0gMTsgaSA8PSBuOyBpKyspCiAgICB7CiAgICAgICAgbG9uZyBsb25nIHBvcyA9IGxvd2VyX2JvdW5kKGIgKyAxLCBiICsgc3ogKyAxLCBhW2ldKSAtIGI7CgogICAgICAgIGxvbmcgbG9uZyBjdXI7CgogICAgICAgIGlmIChwb3MgPT0gMSkKICAgICAgICAgICAgY3VyID0gMTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGN1ciA9IHF1ZXJ5KDEsIDEsIHN6LCAxLCBwb3MgLSAxKSArIDE7CgogICAgICAgIHVwZGF0ZSgxLCAxLCBzeiwgcG9zLCBjdXIpOwoKICAgICAgICBhbnMgPSBtYXgoYW5zLCBjdXIpOwogICAgfQoKICAgIGNvdXQgPDwgYW5zOwp9CgppbnQgbWFpbigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwoKICAgIGlucHV0KCk7CiAgICBzb2x2ZSgpOwoKICAgIHJldHVybiAwOwp9