#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define dbg(x) cout << #x << '=' << x << '\n';
#define ll long long
#define pi pair<int,int>
#define pl pair<long long,long long>
#define rd(x) cin >> x;
#define rda(a,n) for(int i=1;i<=n;i++) cin >> a[i];
#define wr(x) cout << x << ' ';
#define wrl(x) cout << x << '\n';
#define wra(a,n) for(int i=1;i<=n;i++) cout << a[i] << ' '; cout << '\n';
#define lg length()
#define pb(x) push_back(x)
ifstream in("infasuratoare.in");
ofstream out("infasuratoare.out");
#define MAXN 100005
#define INF 1000000005
#define LINF 1000000000000000005
struct comp{
bool operator()(int a, int b){
return a>b;
}
};
int n,a[100005],aint[400005],dp[100005],ans,x[100005],t;
vector <int> p;
void Init(int nod,int l, int r){
aint[nod]=2e9+5;
if(l==r) return;
Init(2*nod,l,(l+r)/2);
Init(2*nod+1,(l+r)/2+1,r);
}
void Upd(int nod, int l, int r, int pos, int val){
if(l>pos || r<pos) return;
if(l==r){
aint[nod]=val; return;
}
Upd(2*nod,l,(l+r)/2,pos,val);
Upd(2*nod+1,(l+r)/2+1,r,pos,val);
aint[nod]=min(aint[2*nod],aint[2*nod+1]);
}
int Qry(int nod, int l, int r, int val){
if(l==r) {
if(aint[nod]<val)
return l;
else
return 0;
}
if(aint[2*nod+1]>=val) return Qry(2*nod,l,(l+r)/2,val);
else return Qry(2*nod+1,(l+r)/2+1,r,val);
}
int main(){
//ios_base :: sync_with_stdio(0);
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
Init(1,1,n);
for(int i=1;i<=n;i++){
int p=Qry(1,1,n,a[i]);
dp[i]=dp[p]+1;
x[i]=p;
Upd(1,1,n,i,a[i]);
if(dp[i]>=ans) ans=dp[i],t=i;
}
cout << ans << '\n';
while(t) p.pb(a[t]),t=x[t];
for(int i=p.size()-1;i>=0;i--) cout << p[i] << ' ';
}