#include <fstream>
#include <string.h>
#include <limits.h>
#define MAX_DIM_TREE 262150 // 2^18 - 1
#define MAX_DIM_VECT 100001
using namespace std;
void Initialise(int n, int &treeDim, int *tree, int *parentVect);
void Process(int n, int treeDim, int &max, int* tree, int* parentVect, istream &fin);
void Update (int pos, int x, int treeDim, int &max, int* tree, int* parentVect);
int main()
{
int treeDim;
int tree[MAX_DIM_TREE];
int parentVect[MAX_DIM_VECT];
int n, max;
ifstream fin;
ofstream fout;
fout.open("scmax.out");
fin.open("scmax.in");
fin >> n;
Initialise(n, treeDim, tree, parentVect);
Process(n, treeDim, max, tree, parentVect, fin);
fout << max << "\n";
for(int i = 0; i < max; i++)
{
fout << parentVect[i] << " ";
}
fin.close();
fout.close();
return 0;
}
void Initialise(int n, int &treeDim, int *tree, int *parentVect)
{
treeDim = 1;
int exp = 1;
while(exp < n)
{
exp *= 2;
treeDim += exp;
}
for(int i = 1; i <= treeDim +1; i++)
{
tree[i] = INT_MAX;
}
memset(parentVect, 0, MAX_DIM_VECT * sizeof(int));
}
void Process (int n, int treeDim, int &max, int* tree, int* parentVect, istream &fin)
{
int x;
for(int i = 0; i < n; ++i)
{
fin >> x;
Update(1, x, treeDim, max, tree, parentVect);
}
}
void Update (int pos, int x, int treeDim, int& max, int* tree, int* parentVect)
{
if(2 * pos > treeDim && x <= tree[pos])
{
tree[pos] = x;
if(tree[pos + 1] == INT_MAX)
{
//memcpy((void*)parentVect, (tree + treeDim / 2 + 1), treeDim / 2 + 1 * sizeof(int));
max = pos - treeDim / 2;
}
return;
}
if(tree[2*pos] >= x)
{
Update(2 * pos, x, treeDim, max, tree, parentVect);
}
else
{
Update(2 * pos + 1, x, treeDim, max, tree, parentVect);
tree[pos] = tree[2 * pos + 1];
}
}