#include const int INF = 1<<30; const int MAXN = 100000; int N; int a[MAXN], b[MAXN]; int da[MAXN], db[MAXN]; int pa[MAXN], pb[MAXN]; int maxi, maxi_id; bool vypis = false; int hledej(const int t[], int hodnota, int delka); void rostouci(const int s[], int d[], int p[]); void vypis1(int id); void vypis2(int id); int main() { scanf("%d", &N); for (int i = 1; i <= N; i++) scanf("%d", &a[i]); for (int i = 1; i <= N; i++) b[i] = a[N+1-i]; rostouci(a, da, pa); rostouci(b, db, pb); maxi = 0; for (int i = 1; i <= N; i++) { if (da[i] + db[N+1-i] - 1 > maxi) { maxi = da[i] + db[N+1-i] - 1; maxi_id = i; } } printf("%d\n", maxi); vypis1(maxi_id); vypis2(N + 1 - maxi_id); printf("\n"); return 0; } int hledej(const int t[], int hodnota, int delka) { int l = 0, r = delka; while (l < r) { int s = (l + r + 1) / 2; if (t[s] <= hodnota) l = s; else r = s - 1; } return l; } void rostouci(const int s[], int d[], int p[]) { int m[MAXN]; m[0] = -1; for (int i = 1; i <= N; i++) m[i] = INF; int dmax; // Délka nejdelší dosud nalezené podposloupnosti d[1] = 1; p[1] = -1; m[1] = s[1]; dmax = 1; for (int i = 2; i <= N; i++) { int id = hledej(m, s[i] - 1, dmax); if (m[id + 1] == INF) dmax++; m[id+1] = s[i]; d[i] = id + 1; p[i] = m[id]; } } void vypis1(int id) { int h = pa[id], o = a[id]; if(h != -1) { id--; while (a[id] != h) id--; vypis1(id); } printf("%d ", o); } void vypis2(int id) { int h = pb[id], o = b[id]; if (vypis) printf("%d ", o); vypis = true; if (h != -1) { id--; while (b[id] != h) id--; vypis2(id); } }