#include using namespace std; #define VI vector #define PII pair #define VPI vector #define mp make_pair #define eb emplace_back #define pb push_back #define st first #define nd second #define endl '\n' #define debug(x) cerr << #x << " " << x << endl; #define ll long long //#define int ll const int N = 1e6 + 7; struct Node { int mi; int ma; int cnt; Node() { mi = 2e9; ma = -2e9; cnt = 0; } }; struct sqTree { int base; vector t; sqTree(int n) { base = 1; while(base < n + 5) base *= 2; t.resize(base * 2 + 5); } Node fix(Node a, Node b) { Node re; if(a.cnt > 0) { re.mi = min(re.mi, a.mi); re.ma = max(re.ma, a.ma); re.cnt += a.cnt; } if(b.cnt > 0) { re.mi = min(re.mi, b.mi); re.ma = max(re.ma, b.ma); re.cnt += b.cnt; } return re; } void insert(int v, int ile) { v += base; t[v].cnt += ile; v /= 2; while(v > 0) { t[v] = fix(t[v * 2], t[v * 2 + 1]); v /= 2; } } Node query(int l, int r) { l += base; r += base; Node re; re = fix(re, t[l]); re = fix(re, t[r]); while(l < r - 1) { if(l % 2 == 0) re = fix(re, t[l + 1]); if(r % 2 == 1) re = fix(re, t[r - 1]); l /= 2; r /= 2; } return re; } }; int first[N]; int tab[N]; vector vek; set answer; void solve() { int n; cin >> n; for(int i = 0; i < n; i++) { cin >> tab[i]; vek.push_back(tab[i]); first[i] = -1; } sort(vek.begin(), vek.end()); vek.resize(unique(vek.begin(), vek.end()) - vek.begin()); map mapp; for(int i = 0; i < vek.size(); i++) { mapp[vek[i]] = i + 1; } for(int i = 0; i < n; i++) { tab[i] = mapp[tab[i]]; } sqTree mid(n); for(int i = 0; i < n; i++) { if(first[tab[i]] != -1) { Node a = mid.query(first[tab[i]], i); if(a.cnt > 0 && a.mi < tab[i]) answer.insert("212"); if(a.cnt > 0 && a.ma > tab[i]) answer.insert("121"); } if(first[tab[i]] == -1) first[tab[i]] = i; mid.t[i + mid.base].mi = tab[i]; mid.t[i + mid.base].ma = tab[i]; mid.insert(i, 1); } sqTree pref(n), suf(n); for(int i = 0; i < n; i++) { suf.t[tab[i] + mid.base].mi = tab[i]; suf.t[tab[i] + mid.base].ma = tab[i]; suf.insert(tab[i], 1); } for(int i = 0; i < n; i++) { suf.insert(tab[i], -1); // liczenie Node big = pref.query(tab[i] + 1, N); if(big.cnt > 0 && suf.query(big.mi + 1, N).cnt > 0) answer.insert("213"); if(big.cnt > 0 && suf.query(tab[i] + 1, big.ma - 1).cnt > 0) answer.insert("312"); if(big.cnt > 0 && suf.query(tab[i], tab[i]).cnt > 0) answer.insert("211"); if(big.cnt > 0 && suf.query(0, tab[i] - 1).cnt > 0) answer.insert("321"); Node sr = pref.query(tab[i], tab[i]); if(sr.cnt > 0 && suf.query(tab[i], tab[i]).cnt > 0) answer.insert("111"); if(sr.cnt > 0 && suf.query(tab[i] + 1, N).cnt > 0) answer.insert("112"); if(sr.cnt > 0 && suf.query(0, tab[i] - 1).cnt > 0) answer.insert("221"); Node small = pref.query(0, tab[i] - 1); // fix if(small.cnt > 0 && suf.query(tab[i] + 1, N).cnt > 0) answer.insert("123"); if(small.cnt > 0 && suf.query(tab[i], tab[i]).cnt > 0) answer.insert("122"); if(small.cnt > 0 && suf.query(small.mi + 1, tab[i] - 1).cnt > 0) answer.insert("132"); if(small.cnt > 0 && suf.query(0, small.ma - 1).cnt > 0) answer.insert("231"); pref.t[tab[i] + mid.base].mi = tab[i]; pref.t[tab[i] + mid.base].ma = tab[i]; pref.insert(tab[i], 1); } for(auto x : answer) { cout << x << endl; } } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int test = 1; while(test--){ solve(); } return 0; }