Cod sursa(job #1090030)

Utilizator heracleRadu Muntean heracle Data 22 ianuarie 2014 11:42:43
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 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 stiv[Q],vect[Q],lmax[Q];

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

    scanf("%d",&n);

    //int x;

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

    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;
}