#include using namespace std; typedef long long ll; typedef double lf; typedef pair pii; typedef pair pll; #define TRACE(x) cerr << #x << ' ' << x << endl #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define REP(i, n) FOR(i, 0, n) #define _ << ' ' << #define fi first #define sec second #define se second #define mp make_pair #define pb push_back const int inf = 1e9 + 5; const int MAXN = 2e5 + 5; const int off = 1 << 18; int A[MAXN]; struct tur_min { vector t; void init() { t.resize(2 * off); REP(i, 2 * off) t[i] = inf; } int get(int x, int lo, int hi, int a, int b) { if(lo >= hi) return inf; if(lo >= a && hi <= b) { return t[x]; } if(lo >= b || hi <= a) { return inf; } int mi = (lo + hi) >> 1; return min(get(x*2, lo, mi, a, b), get(x*2+1, mi, hi, a, b)); } void upd(int x, int v) { x += off; t[x] = v; for(x/=2;x;x/=2) { t[x] = min(t[x*2], t[x*2+1]); } } void upali(int x) { upd(x, A[x]); } void ugasi(int x) { upd(x, inf); } int Get(int a = 0, int b = off) { return get(1, 0, off, a, b); } } Am, Bm; struct tur_max { vector t; void init() { t.resize(2 * off); REP(i, 2 * off) t[i] = -inf; } int get(int x, int lo, int hi, int a, int b) { if(lo >= hi) return -inf; if(lo >= a && hi <= b) { return t[x]; } if(lo >= b || hi <= a) { return -inf; } int mi = (lo + hi) >> 1; return max(get(x*2, lo, mi, a, b), get(x*2+1, mi, hi, a, b)); } void upd(int x, int v) { x += off; t[x] = v; for(x/=2;x;x/=2) { t[x] = max(t[x*2], t[x*2+1]); } } void upali(int x) { upd(x, A[x]); } void ugasi(int x) { upd(x, -inf); } int Get(int a = 0, int b = off) { return get(1, 0, off, a, b); } } AM, BM; map> obrada; set s; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); Am.init(); AM.init(); Bm.init(); BM.init(); int n; cin >> n; REP(i, n) { cin >> A[i]; obrada[A[i]].pb(i); Bm.upali(i); BM.upali(i); } // A manji, B veci for(auto m: obrada) { vector v = m.second; for(auto i: v) { Bm.ugasi(i); BM.ugasi(i); } int y = m.first; int fir = v.front(); int las = v.back(); if(BM.Get(fir + 1, las) > y) { s.insert("121"); } if(Am.Get(fir + 1, las) < y) { s.insert("212"); } if(v.size() >= 3) { s.insert("111"); } int nulpoc = 0, nulkraj = v.size() - 1; for(auto i: v) { // x = y if(nulpoc && BM.Get(i + 1, off) > y) { s.insert("112"); } if(nulpoc && Am.Get(i + 1, off) < y) { s.insert("221"); } // y = z if(nulkraj && BM.Get(0, i) > y) { s.insert("211"); } if(nulkraj && Am.Get(0, i) < y) { s.insert("122"); } // x < y < z if(BM.Get(i + 1, off) > y && Am.Get(0, i) < y) { s.insert("123"); } // z > y, x > y, x < z if(Bm.Get(0, i) < BM.Get(i + 1, off) && Bm.Get(0, i) > y) { s.insert("213"); } // -----||-----, x > z if(BM.Get(0, i) > Bm.Get(i + 1, off) && Bm.Get(i + 1, off) > y) { s.insert("312"); } // x > y > z if(Am.Get(i + 1, off) < y && BM.Get(0, i) > y) { s.insert("321"); } // z < y, x < y, x < z if(Am.Get(0, i) < AM.Get(i + 1, off) && AM.Get(i + 1, off) < y) { s.insert("132"); } // -----||-----, x > z if(AM.Get(0, i) > Am.Get(i + 1, off) && AM.Get(0, i) < y) { s.insert("231"); } nulpoc ++; nulkraj --; } for(auto i: v) { Am.upali(i); AM.upali(i); } } for(auto x: s) { cout << x << endl; } return 0; }