Pagini recente » Cod sursa (job #2676400) | Cod sursa (job #1187327) | Cod sursa (job #2933030) | Cod sursa (job #938012) | Cod sursa (job #1044850)
#include <iostream>
#include <fstream>
using namespace std;
int n,l;
int p[100010];
int q[100010];
int input[100010];
int output[100010];
ifstream in("scmax.in");
ofstream out("scmax.out");
void read()
{
in>>n;
for(int i=1; i<=n; i++)
{
in>>input[i];
}
}
int bsc(int element)
{
int left = 1;
int right = l;
int middle;
int position;
while(left < right)
{
middle = (left + right) / 2;
if(q[middle] <= element)
{
right = middle - 1;
}
else
{
left = middle + 1;
}
}
return right;
}
int includeIt(int pos)
{
if(input[pos] > q[l])
{
q[++l] = input[pos];
return l;
}
else
{
int aux = bsc(input[pos]);
q[aux] = input[pos];
return aux;
}
}
void selectAll()
{
for(int i=1; i<=n; i++)
{
p[i] = includeIt(i);
}
}
int schEl(int element,int position)
{
for(int i = position; i>=1; i--)
{
if(p[i] == element)
{
return i;
}
}
}
void getOutput()
{
int position = n;
for(int i=l; i>=1; i--)
{
position = schEl(i,position);
output[i] = input[position];
}
}
void solve()
{
selectAll();
getOutput();
}
void write()
{
out<<l<<"\n";
for(int i=1; i<=l; i++)
{
out<<output[i]<<" ";
}
}
main()
{
read();
solve();
write();
}