#include using namespace std; //#define int long long const int INF = 1 << 30; const int baza = 1 << 18; struct Drzewo_przedzialowe { vector drz; Drzewo_przedzialowe(vector & v) { drz.resize(baza * 2, -INF); for (int i = 0; i < (int)v.size(); i++) { drz[baza + i] = v[i]; } for (int i = baza - 1; i >= 0; i--) { drz[i] = max(drz[2 * i], drz[2 * i + 1]); } } int czytaj(int pyt_pocz, int pyt_kon) const { pyt_pocz += baza; pyt_kon += baza; int res = drz[pyt_pocz]; while (pyt_pocz <= pyt_kon) { res = max(drz[pyt_pocz], res); res = max(drz[pyt_kon], res); pyt_pocz = (pyt_pocz + 1) / 2; pyt_kon = (pyt_kon - 1) / 2; } return res; } }; bool a111(const vector &v) { multiset s; for (int i : v) { if (s.count(i) >= 2) { return true; } s.insert(i); } return false; } bool a112(const vector &v) { multiset kon(v.begin(), v.end()); set s; for (int i : v) { kon.erase(kon.find(i)); if (s.count(i) && !kon.empty()) { if (*kon.rbegin() > i) { return true; } } else { s.insert(i); } } return false; } bool a121(const vector &v, const Drzewo_przedzialowe d) { map > mapa; for (int i = 0; i < (int)v.size(); i++) { mapa[v[i]].insert(i); } for (auto &i : mapa) { if (i.second.size() < 2) continue; int l = *i.second.begin() + 1; int r = *i.second.rbegin() - 1; if (d.czytaj(l, r) > i.first) { return true; } } return false; } bool a123(const vector &v) { multiset kon(v.begin(), v.end()), pocz; for (int i : v) { kon.erase(kon.find(i)); if (!kon.empty() && !pocz.empty() && *pocz.begin() < i && i < *kon.rbegin()) { return true; } pocz.insert(i); } return false; } bool a213(const vector &v) { multiset kon(v.begin(), v.end()), pocz; for (int i : v) { kon.erase(kon.find(i)); auto it = pocz.upper_bound(i); if (!kon.empty() && it != pocz.end() && *it < *kon.rbegin()) { return true; } pocz.insert(i); } return false; } bool czy[10000]; string foo(string s, bool p, bool r) { for (char c = '1'; c <= '3'; c++) { czy[c] = false; } for (char c : s) { czy[c] = true; } for (char c : s) { if (c > '1' && !czy[c - 1]) return ""; } if (p) { char m = 0; for (char c : s) { m = max(c, m); } for (int i = 0; i < 3; i++) { s[i] = m + 1 - s[i] + '0'; } } if (r) { reverse(s.begin(), s.end()); } return s; } bool fun(string s, const vector &v, const Drzewo_przedzialowe &d) { if (s.empty()) return false; //cerr << " " << s << endl; if (s == "111") { return a111(v); } else if (s == "112") { return a112(v); } else if (s == "121") { return a121(v, d); } else if (s == "123") { return a123(v); } else if (s == "213") { return a213(v); } return false; } vector v, vp, vr, vpr; int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for (int a, i = 0; i < n; i++) { cin >> a; v.push_back(a); vp.push_back(-a); } vr = v; reverse(vr.begin(), vr.end()); vpr = vp; reverse(vpr.begin(), vpr.end()); Drzewo_przedzialowe d(v), dp(vp), dr(vr), dpr(vpr); for (int i = 1; i <= 3; i++) { for (int j = 1; j <= 3; j++) { for (int k = 1; k <= 3; k++) { string s = ""; s += i + '0'; s += j + '0'; s += k + '0'; if (fun(foo(s, false, false), v, d)) { cout << s << "\n"; } else if (fun(foo(s, true, false), vp, dp)) { cout << s << "\n"; } else if (fun(foo(s, false, true), vr, dr)) { cout << s << "\n"; } else if (fun(foo(s, true, true), vpr, dpr)) { cout << s << "\n"; } } } } return 0; }/* */