#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;
}