Cod sursa(job #1895593)

Utilizator NicusorTelescu Nicolae Nicusor Data 28 februarie 2017 06:17:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>

using namespace std;

int v[100001],valori[100001],sol[100001],indice[100001],inainte[100001];
int lungime;

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n;
    scanf("%d ",&n);
    for (int i=1;i<=n;++i)
    {
        scanf("%d",&v[i]);
        int step=1;
        for (;step<=lungime;step<<=1);
        int poz=0;
        for (;step;step>>=1)
            if (poz+step<=lungime && v[i]>valori[poz+step])
            poz+=step;
        if (poz+1>lungime) lungime=poz+1;
        inainte[i]=indice[poz];
        indice[poz+1]=i;
        valori[poz+1]=v[i];
    }
    printf("%d\n",lungime);
    int poz=indice[lungime],cnt=0;
    for (;poz;)
        sol[++cnt]=v[poz], poz=inainte[poz];
    for (int i=cnt;i>=1;--i)
        printf("%d ",sol[i]);
}