#include using namespace std; int inf = 1001001001; template struct SegmentTree { int n; vector dat; SegmentTree() {} SegmentTree(int N) { n = 1; while(n < N) { n *= 2; } dat.resize(2*n-1,-inf); } void update(int x, T val) { x += (n-1); dat[x] = val; while(x > 0) { x = (x-1)/2; dat[x] = max(dat[2*x+1],dat[2*x+2]); } } T query(int a, int b, int k, int l, int r) { if(r <= a || b <= l) return -inf; if(a <= l && r <= b) return dat[k]; T vl = query(a, b, 2*k+1, l, (l+r)/2); T vr = query(a, b, 2*k+2, (l+r)/2, r); return max(vl, vr); } T query(int a,int b) {//[a,b) return query(a,b,0,0,n); } }; int main() { int N; cin >> N; vectorP(N); for(int i = 0; i < N; i++) { cin >> P[i]; } SegmentTreeSeg1(N+1); Seg1.update(0,0); vectormx1(N); for(int i = 0; i < N; i++) { int q = Seg1.query(0,P[i]); mx1[i] = q; Seg1.update(P[i],q+1); } int LIS = Seg1.query(0,N+1); SegmentTreeSeg2(N+2); Seg2.update(N+1,0); vectorans,used(LIS),rev(LIS); for(int i = N-1; i >= 0; i--) { int q = Seg2.query(P[i],N+2); if(mx1[i]+q+1 == LIS) { used[mx1[i]]++; rev[mx1[i]] = P[i]; } Seg2.update(P[i],q+1); } for(int i = 0; i < LIS; i++) { if(used[i] == 1) { ans.push_back(rev[i]); } } cout << ans.size() << endl; for(int i = 0; i < ans.size(); i++) { cout << ans[i] << ((i+1 == ans.size())?"\n":" "); } }