Cod sursa(job #1091992)

Utilizator heracleRadu Muntean heracle Data 26 ianuarie 2014 14:13:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

const int Q=100000;


int n,v[Q+1],w[Q+1],x[Q+1];

bool cmp(int x, int y)
{
    return v[x]<v[y];
}

int arb[Q+1];

int ask(int x)
{
    int rez=0;
    while(x)
    {
        if(arb[x]>rez)
            rez=arb[x];
        x-=x & (-x);
    }
    return rez+1;
}

void update(int x, int val)
{
    while(x<=n)
    {
        if(arb[x]<val)
            arb[x]=val;
        x += x &(-x);
    }
}

int vect[Q],lmax[Q];

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

    scanf("%d",&n);

    //int x;

    bool upp=1;

    for(int i=1; i<=n; i++)
    {
        scanf("%d",&v[i]);

        if(i>=2 && v[i]>v[i-1])
            upp=0;
        w[i]=i;
    }

    if(upp)
    {
        printf("1\n%d",v[1]);
        return 0;
    }

    std::sort(w+1,w+n+1,cmp);

    for(int i=1; i<=n; i++)
    {
        if( v[w[i]] == v[w[i-1]] )
        {
            //printf("?");
            x[w[i]]=x[w[i-1]];
        }

        else
            x[w[i]]=i;
    }

    int max=0,lung,iact;

    for(int i=1; i<=n; i++)
    {
        lung=ask(x[i]-1);
        lmax[i]=lung;
        if(lung>max)
        {
            max=lung;
            iact=i;
        }
        update(x[i],lung);

    }

    printf("%d\n",max);

    int maxx=0,st=0;
    maxx=max;
    vect[max]=v[iact];
    max--;
    for(int i=iact-1; i>0; i--)
    {
        if(lmax[i]==max && v[i]<vect[max+1])
        {
            vect[max]=v[i];
            max--;
        }
    }

    for(int i=1; i<=maxx; i++)
        printf("%d ",vect[i]);

    return 0;
}