#include #define rep(i,a,b) for (int i=a; i PII; typedef vector VI; typedef long long ll; typedef long double ld; const int MN = 200005, P2 = (1 << 18), MTS = 2 * P2 + 5, inf = (int)1e9 + 5; int A[MN], S[MN], pie[MN], ost[MN], ile[MN]; int prefMin[MN], prefMax[MN], prefMin2[MN], prefMax2[MN], sufMin[MN], sufMax[MN], sufMin2[MN], sufMax2[MN], minLewo[MN], maxLewo[MN], minPrawo[MN], maxPrawo[MN]; int T[MTS], U[MTS]; map skala; set < string > ans; int maks(int a, int b) { int ret = 0; a += P2, b += P2; while(a < b) { if(a & 1) ret = max(ret, T[a++]); if(!(b & 1)) ret = max(ret, T[b--]); a >>= 1, b >>= 1; } if(a == b) ret = max(ret, T[a]); return ret; } int mini(int a, int b) { int ret = inf; a += P2, b += P2; while(a < b) { if(a & 1) ret = min(ret, U[a++]); if(!(b & 1)) ret = min(ret, U[b--]); a >>= 1, b >>= 1; } if(a == b) ret = min(ret, U[a]); return ret; } void addMa(int x, int v) { x += P2; T[x] = v; while(x > 1) { x >>= 1; T[x] = max(T[2 * x], T[2 * x + 1]); } } void addMi(int x, int v) { x += P2; U[x] = v; while(x > 1) { x >>= 1; U[x] = min(U[2 * x], U[2 * x + 1]); } } void czysc() { for(int i = 0; i < MTS; ++i) { T[i] = 0; U[i] = inf; } } int main () { int n; scanf("%d", &n); for(int i = 1; i <= n; ++i) { scanf("%d", &A[i]); S[i] = A[i]; } czysc(); sort(S + 1, S + 1 + n); for(int i = 1; i <= n; ++i) skala[S[i]] = i; for(int i = 1; i <= n; ++i) A[i] = skala[A[i]]; prefMin[0] = sufMin[n + 1] = prefMin2[0] = sufMin2[n + 1] = inf; for(int i = 1; i <= n; ++i) { if(!pie[A[i]]) pie[A[i]] = i; ost[A[i]] = i; ++ile[A[i]]; prefMax2[i] = prefMax2[i - 1]; prefMin2[i] = prefMin2[i - 1]; if(ile[A[i]] >= 3) ans.insert("111"); if(ile[A[i]] > 1) { prefMax2[i] = max(prefMax2[i - 1], A[i]); prefMin2[i] = min(prefMin2[i - 1], A[i]); } minLewo[i] = maks(1, A[i] - 1); maxLewo[i] = mini(A[i] + 1, P2 - 5); prefMax[i] = max(prefMax[i - 1], A[i]); prefMin[i] = min(prefMin[i - 1], A[i]); addMa(A[i], A[i]); addMi(A[i], A[i]); } for(int i = 1; i <= n; ++i) ile[A[i]] = 0; czysc(); for(int i = n; i > 0; --i) { ++ile[A[i]]; sufMax2[i] = sufMax2[i + 1]; sufMin2[i] = sufMin2[i + 1]; if(ile[A[i]] > 1) { sufMax2[i] = max(sufMax2[i + 1], A[i]); sufMin2[i] = min(sufMin2[i + 1], A[i]); } minPrawo[i] = maks(1, A[i] - 1); maxPrawo[i] = mini(A[i] + 1, P2 - 5); sufMax[i] = max(sufMax[i + 1], A[i]); sufMin[i] = min(sufMin[i + 1], A[i]); addMa(A[i], A[i]); addMi(A[i], A[i]); } czysc(); for(int i = 1; i <= n; ++i) { addMa(i, A[i]); addMi(i, A[i]); } for(int i = 1; i <= n; ++i) { if(prefMin2[i - 1] < A[i]) ans.insert("112"); if(prefMax2[i - 1] > A[i]) ans.insert("221"); if(sufMin2[i + 1] < A[i]) ans.insert("211"); if(sufMax2[i + 1] > A[i]) ans.insert("122"); if(maks(pie[A[i]] + 1, ost[A[i]] - 1) > A[i]) ans.insert("121"); if(mini(pie[A[i]] + 1, ost[A[i]] - 1) < A[i]) ans.insert("212"); if(prefMin[i - 1] < A[i] && sufMax[i + 1] > A[i]) ans.insert("123"); if(minPrawo[i] > prefMin[i - 1]) ans.insert("132"); if(maxLewo[i] < sufMax[i + 1]) ans.insert("213"); if(minLewo[i] > sufMin[i + 1]) ans.insert("231"); if(prefMax[i - 1] > maxPrawo[i]) ans.insert("312"); if(prefMax[i - 1] > A[i] && sufMin[i + 1] < A[i]) ans.insert("321"); } for(auto s : ans) cout << s << endl; }