Cod sursa(job #1414467)

Utilizator loturiLoturi super ruperi loturi Data 2 aprilie 2015 17:13:33
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

int dp[Nmax],prv[Nmax],v[Nmax],a[Nmax],n;

inline void Reconst(int p)
{
    if(!prv[p])
    {
        printf("%d", a[p]);
        return;
    }
    Reconst(prv[p]);
    printf(" %d", a[p]);
}

inline bool Cmp(int x, int y)
{
    return a[x]<a[y];
}

int main()
{
    int i,len,poz;
    freopen ("scmax.in","r",stdin);
    freopen ("scmax.out","w",stdout);
    scanf("%d", &n);
    for(i=1;i<=n;++i) scanf("%d", &a[i]);
    dp[1]=1; v[1]=1; len=1;
    for(i=2;i<=n;++i)
    {
        poz=lower_bound(v+1,v+len+1,i,Cmp)-v-1;
        if(poz>=1 && poz<=len)
        {
            prv[i]=v[poz]; dp[i]=poz+1; v[dp[i]]=i; len=max(len,poz+1);
        }
        else
        {
            dp[i]=1; v[1]=i;
        }
    }
    printf("%d\n", len);
    Reconst(v[len]);
    printf("\n");
    return 0;
}