Cod sursa(job #1111157)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 18 februarie 2014 17:44:32
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
using namespace std;
int next[100001],lis[100001];
unsigned long long v[100001],k;
int n,i,j,max,z,y;
int lungime(int a)
{
        int i,max;
    if(a!=0)
    {
        if(v[a]>v[a+1])
        {   max=0;
            for(i=a+2;i<=n;i++) if(lis[i]>max&&v[i]>v[a]) max=lis[i],j=i;
            lis[a]=1+max;
            next[a]=j;
            return lungime(a-1);
        }
    else if(v[a]<v[a+1])
    {
        max=0;
        for(i=a+1;i<=n;i++) if(lis[i]>max&&v[i]>v[a]) max=lis[i],j=i;
        lis[a]=1+max;
        next[a]=j;
        return lungime(a-1);
    }
    else
    {   max=0;
        for(i=a+2;i<=n;i++) if(lis[i]>max&&v[i]>v[a]) max=lis[i],j=i;
        lis[a]=1+max;
        next[a]=j;
        return lungime(a-1);
    }
    }
    else return 0;
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    lis[n]=1;
    next[n]=n;
    for(i=1;i<=n;i++) scanf("%llu",&v[i]);
    lungime(n-1);
    max=0;
    for(i=1;i<=n;i++) if(lis[i]>max) max=lis[i],y=i;
    printf("%d\n",max);
    printf("%llu ",v[y]);
    j=y;
    for(i=max;i>1;i--)
    {
        printf("%llu ",v[next[j]]);
        j=next[j];
        }
}