#include using namespace std; typedef long long ll; typedef long double ld; #define rep(i, a, n) for (int i = (a); i < (n); i++) #define per(i, a, n) for (int i = (n) - 1; i >= (a); i--) #define FOR(i, n) rep(i, a, (n)) int sgn(int x) { return (x > 0) - (x < 0); } void ch(vector& in, vector& out) { out[0] = sgn(in[1] - in[0]); out[1] = sgn(in[2] - in[1]); out[2] = sgn(in[2] - in[0]); } vector> labels = { {1,2,3}, {1,3,2}, {2,1,3}, {2,3,1}, {3,1,2}, {3,2,1}, {1,1,2}, {1,2,1}, {2,1,1}, {2,2,1}, {2,1,2}, {1,2,2}, {1,1,1}, }; unordered_map> decompose(vector& v) { unordered_map> s; rep(i,0,v.size()) { s[v[i]].push_back(i); } return s; } const int INF = 1e9 + 100; vector getGreater(vector& v) { int n = v.size(); vector res(n, -1); vector> st = {{n+1, INF}}; per(i,0,n) { while (st.back().second <= v[i]) { st.pop_back(); } if (st.back().first != n+1) { res[i] = st.back().first; } st.push_back({i, v[i]}); } return res; } vector getSuffixMin(vector& x) { int n = x.size(); vector res(n+1, INF); per(i,0,n) { res[i] = x[i]; res[i] = min(res[i], res[i+1]); } return res; } bool g111(vector& x) { int n = x.size(); auto dec = decompose(x); for(auto& a : dec) { if (a.second.size() >= 3) return true; } return false; } bool g112(vector& x) { int n = x.size(); auto dec = decompose(x); auto gre = getGreater(x); for(auto& a : dec) { if (a.second.size() < 2) continue; if (gre[a.second[1]] != -1) return true; } return false; } bool g121(vector& x) { int n = x.size(); auto dec = decompose(x); auto gre = getGreater(x); for(auto& a : dec) { if (a.second.size() < 2) continue; int g = gre[a.second[0]]; if (g != -1 && g < a.second.back()) return true; } return false; } bool g123(vector& x) { int n = x.size(); auto gre = getGreater(x); vector x2; rep(i,0,n) if (gre[i] != -1) x2.push_back(x[i]); auto gre2 = getGreater(x2); for(auto& a : gre2) { if (a != -1) return true; } return false; } bool g231(vector& x) { int n = x.size(); auto gre = getGreater(x); auto sufmin = getSuffixMin(x); rep(i,0,n) { if (gre[i] != -1) { if (sufmin[gre[i]] < x[i]) { return true; } } } return false; } vector modifyPat(vector pat, bool rev, bool neg) { if(rev) { reverse(pat.begin(), pat.end()); } if (neg) { rep(i,0,3) pat[i] = 4-pat[i]; int mn = 10; rep(i,0,3) mn = min(mn, pat[i]); rep(i,0,3) pat[i] = pat[i] - mn + 1; } return pat; } int main(void) { ios_base::sync_with_stdio(false); assert(labels.size() == 13); int n; cin >> n; vector x(n); rep(i,0,n) cin >> x[i]; set> seen; if (g111(x)) { seen.insert({1,1,1}); } rep(rev,0,2) { rep(neg,0,2) { vector xc = x; if (rev) { reverse(xc.begin(), xc.end()); } if (neg) { rep(i,0,n) { xc[i] = -xc[i]; } } if (g112(xc)) { seen.insert(modifyPat({1,1,2}, rev, neg)); } if (g121(xc)) { seen.insert(modifyPat({1,2,1}, rev, neg)); } if (g123(xc)) { seen.insert(modifyPat({1,2,3}, rev, neg)); } if (g231(xc)) { seen.insert(modifyPat({2,3,1}, rev, neg)); } } } for(auto& pat : seen) { rep(j,0,3) { cout << pat[j]; } cout << endl; } }