Cod sursa(job #1156940)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 28 martie 2014 09:48:48
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#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;
}