#include using namespace std; #define LL long long #define LD long double #define PII pair #define VI vector #define VPII vector #define f first #define s second #define MP make_pair #define PB push_back #define endl '\n' #define SIZ(c) (int)(c).size() #define ALL(c) (c).begin(), (c).end() #define REP(i, n) for (int i = 0; i < (int)(n); i++) #define FOR(i, b, e) for (int i = (b); i <= (int)(e); i++) #define FORD(i, b, e) for (int i = (b); i >= (int)(e); i--) #define ll LL #define st f #define nd s #define mp MP #define pb PB #define eb emplace_back #define siz(c) SIZ(c) const int inf = 1e9 + 7; const LL INF = 1e18L + 7; #define sim template ostream & operator << (ostream &p, pair x) {return p << "<" << x.f << ", " << x.s << ">";} sim> auto operator << (ostream &p, n y) -> typename enable_if::value, decltype(y.begin(), p)>::type {int o = 0; p << "{"; for (auto c : y) {if (o++) p << ", "; p << c;} return p << "}";} void dor() {cerr << "\n";} sim, class...s> void dor(n p, s...y) {cerr << p << " "; dor(y...);} sim, class s> void mini(n &p, s y) {if (p > y) p = y;} sim, class s> void maxi(n &p, s y) {if (p < y) p = y;} #ifdef DEB #define debug(...) dor(__FUNCTION__, ":", __LINE__, ": ", __VA_ARGS__) #else #define debug(...) #endif #define I(x) #x " =", (x), " " const int MXN = 2e5+5; int t[MXN]; const int BASE = 1 << 18; int mx[BASE*2]; int mi[BASE*2]; map where; PII query(int a, int b) { a += BASE-1; b += BASE+1; int mir = 1e9; int mxr = -1e9; while(a/2 != b/2) { if(a % 2 == 0) { maxi(mxr, mx[a+1]); mini(mir, mi[a+1]); } if(b % 2 == 1) { maxi(mxr, mx[b-1]); mini(mir, mi[b-1]); } a/=2; b/=2; } return MP(mir, mxr); } set sols; #define cos asfkljsdklfj bool cos(int a, int b, multiset &S) { if(a > b)return 0; auto it = S.lower_bound(a); if(it == S.end())return 0; if(*it <= b)return 1; return 0; } int main() { int n; scanf("%d", &n); FOR(i, 1, n) { scanf("%d", &t[i]); mx[i+BASE] = t[i]; mi[i+BASE] = t[i]; where[t[i]].PB(i); } for(auto &it : where) sort(ALL(it.s)); FORD(i, BASE-1, 0) { mi[i] = min(mi[i*2], mi[i*2+1]); mx[i] = max(mx[i*2], mx[i*2+1]); } for(auto &it: where) { if(it.s.size() == 1)continue; if(it.s.size() > 2) { sols.insert("111"); } int beg = it.s[0]; int end = it.s.back(); auto qq = query(beg, end); if(qq.f < it.f)sols.insert("212"); if(qq.s > it.f)sols.insert("121"); if(query(1, it.s[it.s.size()-2]).f < it.f)sols.insert("122"); if(query(1, it.s[it.s.size()-2]).s > it.f)sols.insert("211"); if(query(it.s[1], n).f < it.f)sols.insert("221"); if(query(it.s[1], n).s > it.f)sols.insert("112"); } FOR(i, 1, n) { auto po = query(i, n); auto przed = query(1, i); if(przed.f < t[i] && t[i] < po.s)sols.insert("123"); if(przed.s > t[i] && t[i] > po.f)sols.insert("321"); } multiset S; FOR(i, 1, n) { auto po = query(i, n); // debug(i, t[i], po, cos(po.f+1, t[i]-1, S)); if(po.f < t[i] && cos(po.f+1, t[i]-1, S))sols.insert("231"); if(po.s > t[i] && cos(t[i]+1, po.s-1, S))sols.insert("213"); S.insert(t[i]); } S.clear(); FORD(i, n, 1) { auto przed = query(1, i); if(przed.f < t[i] && cos(przed.f+1, t[i]-1, S))sols.insert("132"); if(przed.s > t[i] && cos(t[i]+1, przed.s-1, S))sols.insert("312"); S.insert(t[i]); } for(auto i : sols)cout << i << endl; }