Cod sursa(job #1135776)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 8 martie 2014 13:29:39
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#include <algorithm>
#include <memory.h>

#define Nmax 100005

using namespace std;
int v[Nmax],N,pzbest;
int stak[Nmax],L,pz;
int daddy[Nmax],D[Nmax],indi[Nmax];

void read()
{
    scanf("%d",&N);
    for(int i = 1; i <= N; ++i)scanf("%d",v+i);
}

void dynamic()
{
    memset(stak,0x3f3f3f3f,sizeof(stak));
    for(int i = 1; i <= N; ++i){
        pz = lower_bound(stak+1,stak+L+1,v[i]) - stak;
        D[i] = pz;
        if(stak[pz] > v[i]) {stak[pz] = v[i];
            indi[pz] = i;
        }
        daddy[i] = indi[pz-1];

        if(pz > L) {L++;
            pzbest = i;
        }
    }
    printf("%d\n",L);
}

void reconst(int k){
    if(daddy[k])
        reconst(daddy[k]);
    printf("%d ",v[k]);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    read();
    dynamic();
    reconst(pzbest);

    return 0;
}