#include<bits/stdc++.h>
using namespace std;


const int N = 2e5 + 5, M = 19, INF = 1e9;


int n, a[N], f[N], mx[M][N], mn[M][N], step[N];
bool usd[N];
bool used[5][5][5];
bool left_eq[N];
bool right_eq[N];
bool left_le[N];
bool left_gr[N];
bool right_le[N];
bool right_gr[N];

int sgn(int val){
    if(val == 0){
        return 0;
    }
    else if(val < 0){
        return -1;
    }
    else if(val > 0){
        return +1;
    }
}
vector < int > q[N];

void upd(int pos){
    for(int i = pos; i <= n; i |= i + 1){
        f[i] += 1;
    }
}
int get(int pos){
    int res = 0;
    for(int i = pos; i >= 1; i &= i + 1, i--){
        res += f[i];
    }
    return res;
}

int get_max(int l, int r){
    int x = step[r - l + 1];
    return max(mx[x][l], mx[x][r - (1 << x) + 1]);
}
int get_min(int l, int r){
    int x = step[r - l + 1];
    return min(mn[x][l], mn[x][r - (1 << x) + 1]);
}

int t[4 * N];

void update(int v, int l, int r, int pos, int val){
    if(l == r){
        t[v] += val;
        return;
    }
    int mid = (r + l) >> 1;
    if(pos <= mid){
        update(v + v, l, mid, pos, val);
    }
    else{
        update(v + v + 1, mid + 1, r, pos, val);
    }
    t[v] = t[v + v] + t[v + v + 1];
}
int get_max(int v, int l, int r, int tl, int tr){
    if(l > r || l > tr || tl > r || tl > tr || t[v] == 0){
        return -1;
    }
    if(l == r){
        return l;
    }
    int mid = (r + l) >> 1;
    int y = get_max(v + v + 1, mid + 1, r, tl, tr);
    if(y == -1){
        y = get_max(v + v, l, mid, tl, tr);
    }
    return y;
}
int get_min(int v, int l, int r, int tl, int tr){
    if(l > r || l > tr || tl > r || tl > tr || t[v] == 0){
        return -1;
    }
    if(l == r){
        return l;
    }
    int mid = (r + l) >> 1;
    int y = get_min(v + v, l, mid, tl, tr);
    if(y == -1){
        y = get_min(v + v + 1, mid + 1, r, tl, tr);
    }
    return y;
}
int vl[4 * N];
int get_val(int v, int l, int r, int tl, int tr){
    if(l > r || l > tr || tl > r || tl > tr){
        return 0;
    }
    if(tl <= l && r <= tr){
        return vl[v];
    }
    int mid = (r + l) >> 1;
    return max(get_val(v + v, l, mid, tl, tr), get_val(v + v + 1, mid + 1, r, tl, tr));
}
void update_val(int v, int l, int r, int pos, int val){
    if(l == r){
        vl[v] = max(vl[v], val);
        return;
    }
    int mid = (r + l) >> 1;
    if(pos <= mid){
        update_val(v + v, l, mid, pos, val);
    }
    else{
        update_val(v + v + 1, mid + 1, r, pos, val);
    }
    vl[v] = max(vl[v + v], vl[v + v + 1]);
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    for(int i = 2; i < N; i++){
        step[i] = step[i >> 1] + 1;
    }
    cin >> n;
    vector < int > e;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        e.push_back(a[i]);
    }
    sort(e.begin(), e.end());
    e.resize(unique(e.begin(), e.end()) - e.begin());
    int sz = (int)e.size();
    int mxx = 0;
    for(int i = 1; i <= n; i++){
        a[i] = lower_bound(e.begin(), e.end(), a[i]) - e.begin() + 1;
        q[a[i]].push_back(i);
        mxx = max(mxx, (int)q[a[i]].size());
    }
    for(int i = 1; i <= n; i++){
        mn[0][i] = a[i];
        mx[0][i] = a[i];
    }
    for(int i = 1; i <= step[n]; i++){
        for(int j = 1; j + (1 << i) - 1 <= n; j++){
            mn[i][j] = min(mn[i - 1][j], mn[i - 1][j + (1 << (i - 1))]);
            mx[i][j] = max(mx[i - 1][j], mx[i - 1][j + (1 << (i - 1))]);
        }
    }
    for(int i = 1; i <= n; i++){
        if(usd[a[i]]){
            left_eq[i] = true;
        }
        usd[a[i]] = true;
    }
    memset(usd, 0, sizeof(usd));
    for(int i = n; i >= 1; i--){
        if(usd[a[i]]){
            right_eq[i] = true;
        }
        usd[a[i]] = true;
    }
    for(int i = 1; i <= n; i++){
        upd(a[i]);
        if(get(a[i] - 1) > 0){
            left_le[i] = true;
        }
        if(get(n) - get(a[i]) > 0){
            left_gr[i] = true;
        }
    }
    memset(f, 0, sizeof(f));
    for(int i = n; i >= 1; i--){
        upd(a[i]);
        if(get(a[i] - 1) > 0){
            right_le[i] = true;
        }
        if(get(n) - get(a[i]) > 0){
            right_gr[i] = true;
        }
    }
    for(int x = 1; x <= 3; x++){
        for(int y = 1; y <= 3; y++){
            for(int z = 1; z <= 3; z++){
                int xx = sgn(y - x),
                    yy = sgn(z - y),
                    zz = sgn(z - x);
                if(used[xx + 1][yy + 1][zz + 1]){
                    continue;
                }
                ///cout << "KEK: " << x << y << z << " " << xx << " " << yy << " " << zz << "\n";
                used[xx + 1][yy + 1][zz + 1] = true;
                if(x == y && x == z){
                    if(mxx > 2){
                        cout << x << y << z << "\n";
                    }
                    continue;
                }
                if(x == y){
                    if(y < z){
                        for(int i = 1; i <= n; i++){
                            if(left_eq[i] && right_gr[i]){
                                cout << x << y << z << "\n";
                                break;
                            }
                        }
                    }
                    else{
                        for(int i = 1; i <= n; i++){
                            if(left_eq[i] && right_le[i]){
                                cout << x << y << z << "\n";
                                break;
                            }
                        }
                    }
                }
                else if(y == z){
                    if(x < y){
                        for(int i = 1; i <= n; i++){
                            if(left_le[i] && right_eq[i]){
                                cout << x << y << z << "\n";
                                break;
                            }
                        }
                    }
                    else{
                        for(int i = 1; i <= n; i++){
                            if(left_gr[i] && right_eq[i]){
                                cout << x << y << z << "\n";
                                break;
                            }
                        }
                    }
                }
                else if(x == z){
                    if(x < y){
                        for(int val = 1; val <= sz; val++){
                            for(int i = 0; i + 1 < (int)q[val].size(); i++){
                                if(q[val][i] + 1 <= q[val][i + 1] - 1 && get_max(q[val][i] + 1, q[val][i + 1] - 1) > val){
                                    cout << x << y << z << "\n";
                                    break;
                                }
                            }
                        }
                    }
                    else{
                        for(int val = 1; val <= sz; val++){
                            for(int i = 0; i + 1 < (int)q[val].size(); i++){
                                if(q[val][i] + 1 <= q[val][i + 1] - 1 && get_min(q[val][i] + 1, q[val][i + 1] - 1) < val){
                                    cout << x << y << z << "\n";
                                    break;
                                }
                            }
                        }
                    }
                }
                else if(x < y && y < z){
                    for(int i = 1; i <= n; i++){
                        if(left_le[i] && right_gr[i]){
                            cout << x << y << z << "\n";
                            break;
                        }
                    }
                }
                else if(x < y && y > z){
                    if(x > z){
                        memset(t, 0, sizeof(t));
                        int val = 0;
                        for(int i = 1; i <= n; i++){
                            if(val > a[i]){
                                cout << x << y << z << "\n";
                                break;
                            }
                            int pos = get_max(1, 1, n, 1, a[i] - 1);
                            update(1, 1, n, a[i], +1);
                            if(pos == -1){
                                continue;
                            }
                            val = max(val, pos);
                        }
                    }
                    else if(x < z){
                        memset(t, 0, sizeof(t));
                        int val = 0;
                        for(int i = n; i >= 1; i--){
                            if(val > a[i]){
                                cout << x << y << z << "\n";
                                break;
                            }
                            int pos = get_max(1, 1, n, 1, a[i] - 1);
                            update(1, 1, n, a[i], +1);
                            if(pos == -1){
                                continue;
                            }
                            val = max(val, pos);
                        }
                    }
                }
                else if(x > y && y < z){
                    if(x > z){
                        memset(t, 0, sizeof(t));
                        memset(vl, 0, sizeof(vl));
                        int val = 0;
                        for(int i = 1; i <= n; i++){
                            if(get_val(1, 1, n, 1, a[i] - 1) > a[i]){
                                cout << x << y << z << "\n";
                                break;
                            }
                            int pos = get_max(1, 1, n, a[i] + 1, n);
                            update(1, 1, n, a[i], +1);
                            if(pos == -1){
                                continue;
                            }
                            update_val(1, 1, n, a[i], pos);
                        }
                    }
                    else if(x < z){
                        memset(t, 0, sizeof(t));
                        memset(vl, 0, sizeof(vl));
                        int val = 0;
                        for(int i = n; i >= 1; i--){
                            if(get_val(1, 1, n, 1, a[i] - 1) > a[i]){
                                cout << x << y << z << "\n";
                                break;
                            }
                            int pos = get_max(1, 1, n, a[i] + 1, n);
                            update(1, 1, n, a[i], +1);
                            if(pos == -1){
                                continue;
                            }
                            update_val(1, 1, n, a[i], pos);
                        }
                    }
                }
                else if(x > y && y > z){
                    for(int i = 1; i <= n; i++){
                        if(left_gr[i] && right_le[i]){
                            cout << x << y << z << "\n";
                            break;
                        }
                    }
                }
            }
        }
    }
}

