Cod sursa(job #1142726)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 14 martie 2014 09:25:31
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>

using namespace std;
int n, i, k, lmax, x, p, u, v[100005], prec[100005], l[100005], b[100005], s[100005];
int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    scanf("%d", &v[1]);
    prec[1]=0;
    b[1]=1;
    l[1]=1;
    lmax=1;
    for(i=2;i<=n;i++)
    {
        scanf("%d", &v[i]);
        if(v[i]<v[l[1]])
        {
            l[1]=i;
            b[i]=1;
            prec[i]=0;
        }
        else if(v[i]>v[l[lmax]])
        {
            lmax++;
            l[lmax]=i;
            prec[i]=l[lmax-1];
            b[i]=lmax;
        }
        else
        {
            p=1;
            u=lmax;
            while(p<=u)
            {
                k=(p+u)/2;
                if(v[l[k]]>=v[i]&&v[l[k-1]]<v[i])
                {
                    b[i]=k-1;
                    prec[i]=l[k-1];
                    if(v[i]<v[l[k-1]]) l[k-1]=i;
                    break;
                }
                else if(v[l[k]]>v[i])   u=k-1;
                else if(v[l[k]]<v[i])   p=k+1;
            }
        }
    }
    printf("%d\n", lmax);
    s[lmax]=v[l[lmax]];
    x=prec[l[lmax]];
    for(i=lmax-1;i>=1;i--)
    {
        s[i]=v[x];
        x=prec[x];
    }
    for(i=1;i<=lmax;i++)
        printf("%d ", s[i]);
    return 0;
}