#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5 + 4;
struct Node {
  int best = 0;
} st[4 * MAX_N];
int get(int p, int l, int r, int x, int y) {
  if (l > y || r < x) return 0;
  if (l >= x && r <= y) return st[p].best;
  int mid = (l + r) >> 1;
  int f = get(2 * p + 1, l, mid, x, y);
  int s = get(2 * p + 2, mid + 1, r, x, y);
  return max(f, s);
}
void update(int p, int l, int r, int x, int val) {
  if (l > x || r < x) return;
  if (l == r) {
    st[p].best = val;
    return;
  }
  int mid = (l + r) >> 1;
  update(2 * p + 1, l, mid, x, val);
  update(2 * p + 2, mid + 1, r, x, val);
  st[p].best = max(st[2 * p + 1].best, st[2 * p + 2].best);
}
int main() {
  int n;
  scanf("%d", &n);
  int res = 0;
  for (int i = 0; i < n; i++) {
    int v;
    scanf("%d", &v);
    int gt = get(0, 0, n - 1, 1, v - 1) + 1;
    res = max(res, gt);
    update(0, 0, n - 1, v, gt);
  }
  cout << res << endl;
}
