#include using namespace std; const int N = 200001; vector reversed(vector x) { reverse(x.begin(), x.end()); return x; } vector negated(vector x) { for(auto &y: x) y = -y; return x; } void ans_reverse(vector &s) { for(auto &t: s) reverse(t.begin(), t.end()); } void ans_negate(vector &s) { for(auto &t: s) { char mx = *max_element(t.begin(), t.end()), mn = *min_element(t.begin(), t.end()); for(auto &c: t) c = mn + (mx - c); } } void renumber(vector &x) { vector v = x; sort(v.begin(), v.end()); for(auto &y: x) y = lower_bound(v.begin(), v.end(), y) - v.begin(); } vector answers(vector x) { renumber(x); int n = x.size(); vector before(n), after(n); int before_mx = -1; priority_queue common; multiset after_ms(x.begin(), x.end()); for(auto y: x) after[y]++; vector ans; for(auto y: x) { after[y]--; after_ms.erase(after_ms.find(y)); while(!common.empty() && (!before[common.top()] || !after[common.top()])) common.pop(); //111 if(before[y] && after[y]) ans.push_back("111"); //212 if(!common.empty() && common.top() > y) ans.push_back("212"); //112 if(before[y] && !after_ms.empty() && *after_ms.rbegin() > y) ans.push_back("112"); //321 if(before_mx > y && !after_ms.empty() && *after_ms.begin() < y) ans.push_back("321"); //312 auto it = after_ms.upper_bound(y); if(it != after_ms.end() && before_mx > *it) ans.push_back("312"); before_mx = max(before_mx, y); before[y]++; if(before[y] && after[y]) common.push(y); } sort(ans.begin(), ans.end()); ans.erase(unique(ans.begin(), ans.end()), ans.end()); return ans; } int main() { int n; scanf("%d", &n); vector x(n); for(auto &y: x) scanf("%d", &y); set ans; for(int rev: { 0, 1 }) for(int neg: { 0, 1 }) { vector v = x; if(rev) v = reversed(v); if(neg) v = negated(v); auto vans = answers(v); if(rev) ans_reverse(vans); if(neg) ans_negate(vans); ans.insert(vans.begin(), vans.end()); } for(auto s: ans) printf("%s\n", s.c_str()); }