#include using namespace std; #define rep(i, a, b) for(int i = a;i < (b);++i) #define sz(x) (int)(x).size() typedef vector vi; int cmp(int x, int y) { if (x < y) { return 1; } else if (x == y) { return 0; } return -1; } array getchar(int x, int y, int z) { return {cmp(x, y) , cmp(y, z) , cmp(x, z)}; } int main() { ios_base::sync_with_stdio(0); int N; cin >> N; vector V(N); map, array > conv; for (int i : {1,2,3}) { for (int j :{1,2,3}) { for(int k: {1,2,3}) { if (conv.count(getchar(i,j,k)) == 0) { conv[getchar(i,j,k)] = array{i,j,k}; } conv[getchar(i,j,k)] = min(array{i,j,k}, conv[getchar(i,j,k)]); } } } multiset L, R; for (int i = 0;i < N;i++) { cin >> V[i]; R.insert(V[i]); } set > chars; R.erase(R.find(V[0])); for (int i = 1;i < N - 1;i++) { L.insert(V[i - 1]); R.erase(R.find(V[i])); int mid = V[i]; set Left; set Right; Left.insert(*L.rbegin()); Left.insert(*L.begin()); if (L.lower_bound(mid) != L.end()) { auto it = L.lower_bound(mid); Left.insert(*it); it++; if (it!=L.end()) Left.insert(*it); it--; if (it != L.begin()) it--; Left.insert(*it); } Right.insert(*R.rbegin()); Right.insert(*R.begin()); if (R.lower_bound(mid) != R.end()) { auto it = R.lower_bound(mid); Right.insert(*it); it++; if (it!=R.end()) Right.insert(*it); it--; if (it != R.begin()) it--; Right.insert(*it); } for (auto x: L) { for (auto z: R) { // cout << x << " " << mid << " " << z << endl; auto charact = getchar(x, mid, z); chars.insert(getchar(x, mid, z)); } } } // cout << chars.size() << " !" << endl; set > out; for (auto x: chars) { out.insert(conv[x]); } for (auto x: out) { cout << x[0] << x[1] <