Cod sursa(job #1016383)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 26 octombrie 2013 10:16:43
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#include <algorithm>

using namespace std;


int n,v[10000],D[10000],dp[10000],smax;
int ddy[10000];
int binsearch(int x)
{
    int li = 1 , lf = smax , m;
    while(li <= lf)
    {
        m = li + ((lf-li)>>1);
        if(dp[m] > x) lf = m-1;
        else if (dp[m] < x) li = m+1;
            else return m;
    }
    return lf;
}

void add(int x,int i)
{
    int poz = binsearch(x);
    ddy[i] = D[poz];
    if(poz == smax)
    {
        dp[++smax] = x;
        D[smax] = i;
    }
    else
    {
        if(dp[poz+1] > x)
        {
            dp[poz + 1] = x;
            D[poz + 1] = i;
        }
    }
}

void print(int x)
{
    if(x)
    {
        print(ddy[x]);
        printf("%d ",v[x]);

    }
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);

    for(int i = 1; i <= n; ++i)
    {
        scanf("%d",&v[i]);
        add(v[i],i);
    }
    printf("%d\n",smax);
    print(D[smax]);
    return 0;
}