#include<stdio.h>
#include<stdlib.h>
struct node {
int val;
int ind;
node* st;
node* dr;
node() {
st=NULL;
dr=NULL;
}
};
void insert ( node *a, int x, int i) {
node* aux;
if(x>=a->val) {
if(a->dr!=NULL)
insert(a->dr,x,i);
else{
aux=new node();
aux->val=x;
aux->ind=i;
a->dr=aux;
}
}else {
if(a->st!=NULL)
insert(a->st,x,i);
else{
aux=new node();
aux->val=x;
aux->ind=i;
a->st=aux;
}
}
}
void search(node *q, int x, int *t, int i, int *len) {
if( q->val < x) {
if(len[q->ind]+1 > len[i]) {
len[i]= len[q->ind]+1;
t[i]= q->ind;
}
if(q->dr!=NULL)
search(q->dr,x,t,i,len);
}
if(q->st!=NULL)
search(q->st,x,t,i,len);
}
void print(FILE*g, int start, int* t, int *p) {
if(t[start]!=0) {
print(g,t[start],t);
}
fprintf(g,"%d ",p[start]);
}
int main() {
int n,i,start,max=0;
int *p,*t,*len;
node *root=NULL;
//printf("%d\n %s\n %s\n",argc,args[argc-2], args[argc-1]);
FILE *f,*g;
f=fopen("scmax.in","r");
fscanf(f,"%d",&n);
p=(int*)malloc((n+2)*sizeof(int));
t=(int*)malloc((n+2)*sizeof(int));
len=(int*)malloc((n+2)*sizeof(int));
for(i=1;i<=n;i++) {
fscanf(f,"%d",&p[i]);
len[i]=1;
t[i]=0;
}
fclose(f);
root= new node();
root->val=p[1];
root->ind=1;
for(i=2;i<=n;i++) {
insert(root,p[i],i);
search(root ,p[i] , t ,i, len );
if(len[i]>max) {
start=i;
max=len[i];
}
}
g=fopen("scmax.out","w");
fprintf(g,"%d\n",max);
print(g,start,t,p);
fprintf(g,"\n");
fclose(g);
return 0;
}