#include<bits/stdc++.h>
using namespace std;
const int MaxN = 2e5 + 5;
int n;
int a[MaxN], b[MaxN];
int st[4 * MaxN];
void update(int id, int l, int r, int pos, int val)
{
if (l == r)
{
st[id] = max(st[id], val);
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
update(id * 2, l, mid, pos, val);
else
update(id * 2 + 1, mid + 1, r, pos, val);
st[id] = max(st[id * 2], st[id * 2 + 1]);
}
int query(int id, int l, int r, int u, int v)
{
if (u > r || v < l)
return 0;
if (u <= l && r <= v)
return st[id];
int mid = (l + r) / 2;
return max(query(id * 2, l, mid, u, v),
query(id * 2 + 1, mid + 1, r, u, v));
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
b[i] = a[i];
}
sort(b + 1, b + n + 1);
int m = unique(b + 1, b + n + 1) - b - 1;
int ans = 0;
for (int i = 1; i <= n; i++)
{
int pos = lower_bound(b + 1, b + m + 1, a[i]) - b;
int best = 0;
if (pos > 1)
best = query(1, 1, m, 1, pos - 1);
int cur = best + 1;
update(1, 1, m, pos, cur);
ans = max(ans, cur);
}
cout << ans;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNYXhOID0gMmU1ICsgNTsKCmludCBuOwppbnQgYVtNYXhOXSwgYltNYXhOXTsKaW50IHN0WzQgKiBNYXhOXTsKCnZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgcG9zLCBpbnQgdmFsKQp7CiAgICBpZiAobCA9PSByKQogICAgewogICAgICAgIHN0W2lkXSA9IG1heChzdFtpZF0sIHZhbCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKCiAgICBpZiAocG9zIDw9IG1pZCkKICAgICAgICB1cGRhdGUoaWQgKiAyLCBsLCBtaWQsIHBvcywgdmFsKTsKICAgIGVsc2UKICAgICAgICB1cGRhdGUoaWQgKiAyICsgMSwgbWlkICsgMSwgciwgcG9zLCB2YWwpOwoKICAgIHN0W2lkXSA9IG1heChzdFtpZCAqIDJdLCBzdFtpZCAqIDIgKyAxXSk7Cn0KCmludCBxdWVyeShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KQp7CiAgICBpZiAodSA+IHIgfHwgdiA8IGwpCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKHUgPD0gbCAmJiByIDw9IHYpCiAgICAgICAgcmV0dXJuIHN0W2lkXTsKCiAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CgogICAgcmV0dXJuIG1heChxdWVyeShpZCAqIDIsIGwsIG1pZCwgdSwgdiksCiAgICAgICAgICAgICAgIHF1ZXJ5KGlkICogMiArIDEsIG1pZCArIDEsIHIsIHUsIHYpKTsKfQoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKCiAgICBjaW4gPj4gbjsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCiAgICB7CiAgICAgICAgY2luID4+IGFbaV07CiAgICAgICAgYltpXSA9IGFbaV07CiAgICB9CgogICAgc29ydChiICsgMSwgYiArIG4gKyAxKTsKCiAgICBpbnQgbSA9IHVuaXF1ZShiICsgMSwgYiArIG4gKyAxKSAtIGIgLSAxOwoKICAgIGludCBhbnMgPSAwOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIHsKICAgICAgICBpbnQgcG9zID0gbG93ZXJfYm91bmQoYiArIDEsIGIgKyBtICsgMSwgYVtpXSkgLSBiOwoKICAgICAgICBpbnQgYmVzdCA9IDA7CiAgICAgICAgaWYgKHBvcyA+IDEpCiAgICAgICAgICAgIGJlc3QgPSBxdWVyeSgxLCAxLCBtLCAxLCBwb3MgLSAxKTsKCiAgICAgICAgaW50IGN1ciA9IGJlc3QgKyAxOwoKICAgICAgICB1cGRhdGUoMSwgMSwgbSwgcG9zLCBjdXIpOwoKICAgICAgICBhbnMgPSBtYXgoYW5zLCBjdXIpOwogICAgfQoKICAgIGNvdXQgPDwgYW5zOwp9