#include using namespace std; using ll = long long; using Vi = vector; using Pii = pair; #define mp make_pair #define pb push_back #define x first #define y second #define rep(i,b,e) for(int i = (b); i < (e); i++) #define each(a, x) for(auto& a : (x)) #define all(x) (x).begin(),(x).end() #define sz(x) int((x).size()) struct RMIQ { using T = int; static constexpr T ID = INT_MAX; T f(T a, T b) {return min(a,b); } vector > s; RMIQ(const vector& vec = {}) { s = {vec}; for(int h = 1; h <= sz(vec); h *= 2) { s.emplace_back(); auto& prev = s[sz(s)-2]; rep(i,0, sz(vec) -h*2+1){ s.back().pb(f(prev[i], prev[i+h])); } } } T query(int b, int e){ if (b >= e) return ID; int k = 31 - __builtin_clz(e-b); return f(s[k][b], s[k][e - (1< > s; RMAQ(const vector& vec = {}) { s = {vec}; for(int h = 1; h <= sz(vec); h *= 2) { s.emplace_back(); auto& prev = s[sz(s)-2]; rep(i,0, sz(vec) -h*2+1){ s.back().pb(f(prev[i], prev[i+h])); } } } T query(int b, int e){ if (b >= e) return ID; int k = 31 - __builtin_clz(e-b); return f(s[k][b], s[k][e - (1<> n; vector x(n); for(int i = 0; i < n; ++i){ cin >> x[i]; } set ans; { vector maxpr, minpr, maxsf,minsf; maxpr = x; for(int i = 1; i < n; ++i){ maxpr[i] = max(maxpr[i], maxpr[i-1]); } minpr = x; for(int i = 1; i < n; ++i){ minpr[i] = min(minpr[i], minpr[i-1]); } maxsf = x; for(int i = n-2; i >= 0; --i){ maxsf[i] = max(maxsf[i+1], maxsf[i]); } minsf = x; for(int i = n-2; i >= 0; --i){ minsf[i] = min(minsf[i+1], minsf[i]); } {//213 set s; s.insert(x[0]); for(int i = 1; i < n-1; ++i){ int a = x[i]; int c = maxsf[i+1]; auto it = s.upper_bound(a); int b = 0; if(it != s.end()){ b = *it; if(a < b && b < c){ ans.insert("213"); } } s.insert(x[i]); } } {//123 set s; s.insert(x[0]); for(int i = 1; i < n-1; ++i){ int b = x[i]; int a = minpr[i-1]; int c = maxsf[i+1]; if(a < b && b < c){ ans.insert("123"); } } } {//321 set s; s.insert(x[0]); for(int i = 1; i < n-1; ++i){ int b = x[i]; int c = maxpr[i-1]; int a = minsf[i+1]; if(a < b && b < c){ ans.insert("321"); } } } //TODO {//231 set s; s.insert(x[0]); for(int i = 1; i < n-1; ++i){ int c = x[i]; int a = minsf[i+1]; auto it = s.upper_bound(a); int b = 0; if(it != s.end()){ b = *it; if(a < b && b < c){ ans.insert("231"); } } s.insert(x[i]); } } {//312 set s; s.insert(x[n-1]); for(int i = n-2; i >= 1; --i){ int a = x[i]; int c = maxpr[i-1]; auto it = s.upper_bound(a); int b = 0; if(it != s.end()){ b = *it; if(a < b && b < c){ ans.insert("312"); } } s.insert(x[i]); } } {//132 set s; s.insert(x[n-1]); for(int i = n-2; i >= 1; --i){ int a = minpr[i-1]; int c = x[i]; auto it = s.upper_bound(a); int b = 0; if(it != s.end()){ b = *it; if(a < b && b < c){ ans.insert("132"); } } s.insert(x[i]); } } ///1 {//211 set s; s.insert(x[n-1]); for(int i = n-2; i >= 1; --i){ int b = maxpr[i-1]; int a1 = x[i]; auto it = s.lower_bound(a1); int a2 = 0; if(it != s.end()){ a2 = *it; if(a1 == a2 && a1 < b){ ans.insert("211"); } } s.insert(x[i]); } } {//122 set s; s.insert(x[n-1]); for(int i = n-2; i >= 1; --i){ int a = minpr[i-1]; int b1 = x[i]; auto it = s.lower_bound(b1); int b2 = 0; if(it != s.end()){ b2 = *it; if(b1 == b2 && a < b1){ ans.insert("122"); } } s.insert(x[i]); } } {//112 set s; s.insert(x[0]); for(int i = 1; i < n-1; ++i){ int a1 = x[i]; int b = maxsf[i+1]; auto it = s.lower_bound(a1); int a2 = 0; if(it != s.end()){ a2 = *it; if(a1 == a2 && a1 < b){ ans.insert("112"); } } s.insert(x[i]); } } {//221 set s; s.insert(x[0]); for(int i = 1; i < n-1; ++i){ int a = minsf[i+1]; int b1 = x[i]; auto it = s.lower_bound(b1); int b2 = 0; if(it != s.end()){ b2 = *it; if(b1 == b2 && a < b1){ ans.insert("221"); } } s.insert(x[i]); } } } map M; vector xs(n), ile(n+1), pier(n+1, -1), ost(n+1), yy;; int o = 1; yy = x; sort(all(yy)); for(int i = 0; i < n; ++i){ if(!M.count(yy[i])){ M[yy[i]] = o; ++o; } } for(int i = 0; i < n; ++i){ xs[i] = M[x[i]]; if(pier[xs[i]] == -1)pier[xs[i]] = i; ost[xs[i]] = i; ile[xs[i]]++; if(ile[xs[i]] >= 3)ans.insert("111"); } { RMIQ I1(xs); for(int i = 0; i < n; ++i){ int r = xs[i]; int a = pier[r]; int b = ost[r]; if(b > a+1){ int c = I1.query(a+1,b); if(c < r){ ans.insert("212"); } } } } { RMAQ A2(xs); for(int i = 0; i < n; ++i){ int r = xs[i]; int a = pier[r]; int b = ost[r]; if(b > a+1){ int c = A2.query(a+1,b); if(c > r){ ans.insert("121"); } } } } for(auto y : ans){ cout << y << '\n'; } return 0; }