#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_C 1048576

int n, p2, cmax, sol, psol;
int A[MAX_C], vine[MAX_C], d[MAX_C], S[MAX_C];
int Arb[3 * MAX_C], Poz[3 * MAX_C];

inline int query(int nod, int st, int dr, int left, int right) {
	if (st > right || dr < left) return 0;

	if (left <= st && dr <= right) return Poz[nod];
	else {
    	int mid = (st + dr) / 2;

		int x = query(nod * 2, st, mid, left, right);
		int y = query(nod * 2 + 1, mid + 1, dr, left, right);

		if (d[A[x]] > d[A[y]]) return x;
		else return y;
	}
}

void update(int nod, int val, int p) {
	Arb[nod] = val; Poz[nod] = p;
	while (nod) {
    	if (Arb[nod] > Arb[nod / 2]) {
        	Arb[nod / 2] = Arb[nod];
			Poz[nod / 2] = Poz[nod];
			nod /= 2;
		}	
		else break;
	}
}

void get_sol() {
	sol = psol;
	while (sol) {
		S[++S[0]] = sol;
		sol = vine[sol];
	}

	printf("%d\n", n - S[0]);
	for (int i = S[0]; i >= 1; i--)
		printf("%d ", A[S[i]] - 1);
	printf("\n");
}

int main() {

	#ifndef ONLINE_JUDGE
		freopen("data.in", "r", stdin);
		freopen("data.out", "w", stdout);
	#endif

	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &A[i]);
		A[i]++;

		cmax = max(cmax, A[i]);
	}

	p2 = 1;
	while (p2 < cmax) p2 *= 2;

	for (int i = 1; i <= n; i++) {
		int x = 0, y = 0, z = 0;

    	if (1 <= A[i] - 2) x = query(1, 1, p2, 1, A[i] - 2);
		if (A[i] + 2 <= cmax) y = query(1, 1, p2, A[i] + 2, cmax);
		z = query(1, 1, p2, A[i], A[i]);

		d[A[i]] = d[A[i]] + 1;
		vine[i] = z;

		if (d[A[x]] + 1 > d[A[i]]) {
        	d[A[i]] = d[A[x]] + 1;
			vine[i] = x;
		}

		if (d[A[y]] + 1 > d[A[i]]) {
        	d[A[i]] = d[A[y]] + 1;
			vine[i] = y;
		}

		if (d[A[i]] > sol) {
			sol = d[A[i]];
			psol = i;
		}

		update(p2 + A[i] - 1, d[A[i]], i);
	}

	get_sol();

	return 0;
}
