Cod sursa(job #1374576)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 5 martie 2015 10:07:59
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>
#define nmax 100100

using namespace std;

int i, n, m, l, r, pos, k, j;
int sol[nmax], ll[nmax], a[nmax];

int main()
{
    freopen("scmax.in", "rt", stdin);
    freopen("scmax.out", "wt", stdout);

    scanf("%d", &n);

    for(i=1; i<=n; ++i)
        scanf("%d", &a[i]);

    k=0; sol[0]=0;

    for(i=1; i<=n; ++i)
    if(a[i]>sol[k]) sol[++k]=a[i], ll[i]=k;
    else
    {
        l=1, r=k, pos=k;
        while(l<=r)
        {
            m=(l+r)/2;
            if(sol[m]<a[i]) l=m+1;
            else pos=m, r=m-1;
        }
        sol[pos]=a[i];
        ll[i]=pos;
    }
    printf("%d\n", k);
    for(i=n, j=0; i>0 && k; --i)
        if(ll[i]==k) sol[++j]=a[i], --k;

    for(i=j; i>0; --i)
        printf("%d ", sol[i]);
    return 0;
}