Cod sursa(job #744407)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 8 mai 2012 17:29:06
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

int H,arb[200010],N,a[200011],v[200011],l[210001],i,lst,mx;

void update(int Nod,int st,int dr,int poz,int val)
{
    if (st==dr)
    {
        arb[Nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if (poz<=mij)
    {
        update(Nod*2,st,mij,poz,val);
    }
    else update(Nod*2+1,mij+1,dr,poz,val);
    arb[Nod]=max(arb[Nod*2],arb[Nod*2+1]);
}

int maxarb(int Nod,int st,int dr,int poz)
{
    if (st==dr)
    {
        return arb[Nod];
    }
    int mij=(st+dr)/2;
    if (poz<=mij)
    {
        return maxarb(Nod*2,st,mij,poz);
    }
    else return max(arb[Nod*2],maxarb(Nod*2+1,mij+1,dr,poz));
}

bool cmp(int i,int j)
{
    return (v[i]<v[j]);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&N);
    for (i=1;i<=N;i++)
    {
        scanf("%d",&v[i]);
        a[i]=v[i];
    }
    sort(a+1,a+N+1);
    H=0;
    for (i=1;i<=N;i++)
    {
        if (a[i]!=a[H])
        {
            ++H;
            a[H]=a[i];
        }
    }
    for (i=1;i<=N;i++)
    {
        v[i]=lower_bound(a+1,a+H+1,v[i])-a;
    }
    for (i=1;i<=N;i++)
    {
        if (v[i]==1)
        {
            l[1]=1;
        }
        else
        l[v[i]]=maxarb(1,1,N,v[i]-1)+1;
        update(1,1,N,v[i],l[v[i]]);
    }
    printf("%d\n",arb[1]);
    mx=arb[1];
    for (i=1;i<=N;i++)
    {
        if(l[i]==mx)
        {
            lst=i;
            break;
        }
    }
    v[1]=a[lst];
    for (i=lst-1;i>=1;i--)
    {
        if (l[i]==l[lst]-1)
        {
            v[mx-l[i]+1]=a[i];
            lst=i;
        }
    }
    for (i=mx;i>=1;i--)
    {
        printf("%d ",v[i]);
    }
    printf("\n");
    return 0;
}