#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 3e4 + 5;
int n;
ll a[N];
int dp[N]; // dp[i] = độ dài dãy con tăng dài nhất kết thúc tại i
void compress(ll a[]) {
vector<ll> vals;
for (int i = 1; i <= n; i++) vals.push_back(a[i]);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
for (int i = 1; i <= n; i++) {
a[i] = lower_bound(vals.begin(), vals.end(), a[i]) - vals.begin();
a[i] = a[i] + 1;
}
}
int ft[N];
int getMax(int i) {
int ans = 0;
for (; i > 0; i -= i & (-i)) ans = max(ans, ft[i]);
return ans;
}
void update(int i, int val) {
for (; i <= n; i += i & (-i)) ft[i] = max(ft[i], val);
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
// for (int i = 1; i <= n; i++) {
// dp[i] = 1;
// for (int j = 1; j < i; j++) {
// // max của tất cả các dp[j] ở đằng trước sao cho a[j] thuộc đoạn [1, a[i] - 1]
// if (a[j] < a[i]) dp[i] = max(dp[i], dp[j] + 1);
// }
// } // O(n^2)
compress(a);
for (int i = 1; i <= n; i++) {
dp[i] = 1;
dp[i] = getMax(a[i] - 1) + 1;
update(a[i], dp[i]);
} // O(n * log2(n))
int ans = 0;
for (int i = 1; i <= n; i++) ans = max(ans, dp[i]);
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTiA9IDNlNCArIDU7ICAKCmludCBuOyAgCmxsIGFbTl07IAppbnQgZHBbTl07IC8vIGRwW2ldID0gxJHhu5kgZMOgaSBkw6N5IGNvbiB0xINuZyBkw6BpIG5o4bqldCBr4bq/dCB0aMO6YyB04bqhaSBpIAoKdm9pZCBjb21wcmVzcyhsbCBhW10pIHsKCXZlY3RvcjxsbD4gdmFsczsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB2YWxzLnB1c2hfYmFjayhhW2ldKTsgIAoJCglzb3J0KHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSk7ICAgCgl2YWxzLnJlc2l6ZSh1bmlxdWUodmFscy5iZWdpbigpLCB2YWxzLmVuZCgpKSAtIHZhbHMuYmVnaW4oKSk7CgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJYVtpXSA9IGxvd2VyX2JvdW5kKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSwgYVtpXSkgLSB2YWxzLmJlZ2luKCk7IAoJCWFbaV0gPSBhW2ldICsgMTsgIAoJfQp9CgppbnQgZnRbTl07IAoKaW50IGdldE1heChpbnQgaSkgewoJaW50IGFucyA9IDA7ICAgCglmb3IgKDsgaSA+IDA7IGkgLT0gaSAmICgtaSkpIGFucyA9IG1heChhbnMsIGZ0W2ldKTsgCglyZXR1cm4gYW5zOyAKfQoKdm9pZCB1cGRhdGUoaW50IGksIGludCB2YWwpIHsKCWZvciAoOyBpIDw9IG47IGkgKz0gaSAmICgtaSkpIGZ0W2ldID0gbWF4KGZ0W2ldLCB2YWwpOyAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgIAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07CgoJLy8gZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkvLyAJZHBbaV0gPSAxOyAgIAoJLy8gCWZvciAoaW50IGogPSAxOyBqIDwgaTsgaisrKSB7CgkvLyAJCS8vIG1heCBj4bunYSB04bqldCBj4bqjIGPDoWMgZHBbal0g4bufIMSR4bqxbmcgdHLGsOG7m2Mgc2FvIGNobyBhW2pdIHRodeG7mWMgxJFv4bqhbiBbMSwgYVtpXSAtIDFdCgkvLyAJCWlmIChhW2pdIDwgYVtpXSkgZHBbaV0gPSBtYXgoZHBbaV0sIGRwW2pdICsgMSk7IAoJLy8gCX0KCS8vIH0gLy8gTyhuXjIpCgoJY29tcHJlc3MoYSk7ICAKCQoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZHBbaV0gPSAxOyAgIAoJCWRwW2ldID0gZ2V0TWF4KGFbaV0gLSAxKSArIDE7IAoJCXVwZGF0ZShhW2ldLCBkcFtpXSk7IAoJfSAvLyBPKG4gKiBsb2cyKG4pKQoKCWludCBhbnMgPSAwOyAgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGFucyA9IG1heChhbnMsIGRwW2ldKTsgCgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0K