Pagini recente » Cod sursa (job #2279176) | Cod sursa (job #2682644) | Cod sursa (job #1121298) | Monitorul de evaluare | Cod sursa (job #1156940)
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[NMAX];
int p[NMAX], prec[NMAX], sir[NMAX];
int dimp, lg;
int caut(int x)
{
int step = 1;
while (step < dimp) step <<= 1;
int i;
for (i = 1; step; step >>= 1)
if (i+step <= dimp && p[i+step] <= x) i += step;
if (p[dimp] < x ) return dimp+1;
if (p[i]<x) return i+1;
return i;
}
int main()
{
int poz;
fin>>n;
for (int i = 1; i <= n; ++i)
fin>>a[i];
for (int i = 1; i <= n; ++i)
{
poz = caut(a[i]);
p[poz] = a[i];
prec[i] = poz;
if (poz > dimp) ++dimp;
}
fout<<dimp<<'\n';
int j = n;
for (int i = dimp; i > 0; --i)
{
while (prec[j] != i) --j;
sir[++lg] = a[j];
}
for (int i = lg; i > 0; --i)
{
fout<<sir[i]<<" ";
}
return 0;
}