Cod sursa(job #744391)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 8 mai 2012 16:32:24
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

int H,rec[200000],arb[200000],N,a[100001],v[100001],l[100001],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]);
        rec[i]=a[i]=i;
    }
    sort(a+1,a+N+1,cmp);
    H=0;

    for (i=1;i<=N;i++)
    {
        if (v[a[i]]!=v[rec[H]])
        {
            ++H;
            rec[H]=a[i];
        }
    }
    for (i=1;i<=H;i++)
    {
        if (rec[i]==1)
        {
            l[1]=1;
        }
        else
        l[rec[i]]=maxarb(1,1,N,rec[i]-1)+1;
        update(1,1,N,rec[i],l[rec[i]]);
    }
    printf("%d\n",arb[1]);
    mx=arb[1];
    for (i=1;i<=N;i++)
    {
        if(l[i]==mx)
        {
            lst=i;
            break;
        }
    }
    a[1]=v[lst];
    for (i=lst-1;i>=1;i--)
    {
        if (l[i]==l[lst]-1)
        {
            a[mx-l[i]+1]=v[i];
            lst=i;
        }
    }
    for (i=mx;i>=1;i--)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}