import sys #input = sys.stdin.readline #文字列につけてはダメ input = sys.stdin.buffer.readline #文字列につけてはダメ #sys.setrecursionlimit(1000000) import bisect #import itertools #import random #from heapq import heapify, heappop, heappush #from collections import defaultdict #from collections import deque #import copy #from functools import lru_cache def LIS(N, A): #狭義単調増加部分列 INF = pow(10,18) #dp[i]: 最長増加部分列がi個の時の最後の値の最小値 dp = [INF]*(N+1) maxlis = [0]*N #i番目を最後に使ってできる狭義単調増加部分列の最大値 - 1 for i,x in enumerate(A): idx = bisect.bisect_left(dp, x) #x未満の数字を探して更新。 dp[idx] = x #min(x, dp[idx]) maxlis[i] = idx #print(dp) #辞書順最小の復元 target = max(maxlis) #今探したいところ。 ret = [0]*(target + 1) for i in reversed(range(N)): #一番最後に出てきているtargetのindexならそれを採用。 if maxlis[i] == target: ret[target] = A[i] target -= 1 #INF未満となるIndexを返す。辞書順最小のLISも返す。 return bisect.bisect_left(dp, INF), ret def LDS(N, A): B = [] for i in reversed(range(N)): a = A[i] B.append(-a) length, X = LIS(N, B) #-をつけた逆順で返ってくる。 ret = [] for i in reversed(range(len(X))): ret.append(-X[i]) return length, ret def main(): n = int(input()) P = list(map(int,input().split())) m, jisyo0 = LIS(n,P) m, jisyo1 = LDS(n,P) ans = [] for a,b in zip(jisyo0, jisyo1): if a == b: ans.append(a) print(len(ans)) print(*ans) if __name__ == '__main__': main()