import sys input = sys.stdin.readline N=int(input()) A=list(map(int,input().split())) # LIS(最長増加部分列) import bisect DP=[float("inf")]*N # DP[i]で、長さiのLISの最終要素の最小値. POS=[-1]*N for i in range(N): a=A[i] pos=bisect.bisect_left(DP,a) DP[pos]=a POS[i]=pos ANS=0 for i in range(N): if DP[i]!=float("inf"): # float("inf")でない最小のものがLISの長さ ANS=i LIST=[] x=ANS for i in range(N-1,-1,-1): if POS[i]==x: LIST.append(A[i]) x-=1 #print(LIST) A=[-a for a in A][::-1] DP=[float("inf")]*N # DP[i]で、長さiのLISの最終要素の最小値. POS=[-1]*N for i in range(N): a=A[i] pos=bisect.bisect_left(DP,a) DP[pos]=a POS[i]=pos ANS=0 for i in range(N): if DP[i]!=float("inf"): # float("inf")でない最小のものがLISの長さ ANS=i LIST2=[] x=ANS for i in range(N-1,-1,-1): if POS[i]==x: LIST2.append(A[i]) x-=1 SET=set(LIST) SET2=set([-x for x in LIST2]) ANS=[] A=[-a for a in A][::-1] for a in A: if a in SET and a in SET2: ANS.append(a) print(len(ANS)) print(*ANS)