Cod sursa(job #1019938)

Utilizator eugen_ptrEugen Patru eugen_ptr Data 1 noiembrie 2013 11:50:37
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <cstdio>

using namespace std;

int v[100005],p[100005],c[100005];
int n,len;

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

int inserare(int v)
{
    int st=0, dr=len;

    while(st <= dr )
    {
        int mij=(st+dr)/2;
        if(v<c[mij])
            dr=mij-1;
        else
           if(v>c[mij])
            st=mij+1;
            else
            {
                st=mij;
                break;
            }
    }
    c[st]=v;
    if(st > len)
        len++;
    return st;
}

void scmax()
{
    c[0]=v[0]=p[0]=0;

    for(int i=1;i<n;i++)
          p[i]=inserare(v[i]);

}

void afisare(int i,int lg)
{
    if(lg > 0)
        if(p[i]==lg)
        {
        afisare(i-1,lg-1);
        printf("%d ",v[i]);
        }
    else
            afisare(i-1,lg);
}


int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    citire();
    scmax();
    printf("%d\n",len);
    afisare(n-1,len);
    return 0;
}