#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
long long tr[4 * N], v[4 * N];
long long L[N], R[N];
int n;
void update(int no, int l, int r, int i, long long val) {
  if (l == r) {
    tr[no] = val;
    return;
  }
  int nxt = (no << 1);
  int mid = (l + r) >> 1;
  if (i <= mid)
    update(nxt, l, mid, i, val);
  else
    update(nxt + 1, mid + 1, r, i, val);
  tr[no] = max(tr[nxt], tr[nxt + 1]);
}
long long query(int no, int l, int r, int i, int j) {
  if (r < i || l > j) return -10000000000000000LL;
  if (l >= i && r <= j) return tr[no];
  int nxt = (no << 1);
  int mid = (l + r) >> 1;
  return max(query(nxt, l, mid, i, j), query(nxt + 1, mid + 1, r, i, j));
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) scanf("%lld", v + i);
  long long lis = 0;
  for (int i = 0; i < n; ++i) {
    long long foo = query(1, 0, N - 1, 0, v[i] - 1);
    lis = max(lis, foo + 1);
    L[i] = foo + 1;
    update(1, 0, N - 1, v[i], foo + 1);
  }
  memset(tr, 0, sizeof tr);
  for (int i = n - 1; i >= 0; --i) {
    int foo = query(1, 0, N - 1, v[i] + 1, N - 1) + 1;
    R[i] = foo;
    update(1, 0, N - 1, v[i], foo);
  }
  string s;
  s.resize(n, '1');
  vector<pair<long long, long long> > ax;
  for (int i = 0; i < n; ++i) {
    if (L[i] + R[i] - 1 == lis) {
      s[i] = '3';
      ax.push_back(make_pair(L[i], i));
    }
  }
  sort(ax.begin(), ax.end());
  for (int i = 0; i + 1 < ax.size(); ++i) {
    if (ax[i].first == ax[i + 1].first) {
      s[ax[i].second] = s[ax[i + 1].second] = '2';
    }
  }
  printf("%s\n", s.c_str());
  return 0;
}
