Cod sursa(job #1129635)

Utilizator DanFodorFODOR Dan Horatiu DanFodor Data 28 februarie 2014 00:22:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>

using namespace std;

int pozant[100021], valmin[100021], a[100021], lungime[100021], al_mai_mare, indice, poz[100021];

void afis (int i)
{
    if (i>0)
    {
        afis(pozant[i]);
        printf("%d ", a[i]);
    }
}


int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int n;
    scanf("%d", &n);
    int i, li, lf, m;
    for (i=1; i<=n; i++)
    {
        scanf("%d", &a[i]);
        valmin[i]=2000000021;
    }
    valmin[1]=a[1];
    pozant[1]=0;
    poz[1]=1;
    lungime[1]=1;
    for (i=2; i<=n; i++)
    {
        li=1;
        lf=i-1;
        m=(li+lf+1)/2;
        while (li<=lf)
            if (valmin[m]>=a[i])
            {
                lf=m-1;
                m=(li+lf+1)/2;
            }
            else
            {
                li=m+1;
                m=(li+lf+1)/2;
            }
        lungime[i]=m;
        if (valmin[m]>a[i])
        {
            valmin[m]=a[i];
            poz[m]=i;
        }
        pozant[i]=poz[m-1];
    }
    for (i=1; i<=n; i++)
        if (lungime[i]>al_mai_mare)
        {
            al_mai_mare=lungime[i];
            indice=i;
        }
    printf("%d\n", al_mai_mare);
    afis(indice);
    return 0;
}