Cod sursa(job #1260727)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 11 noiembrie 2014 15:16:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

int a[Nmax],dp[Nmax],s[Nmax],p[Nmax],n,t[Nmax];

int main()
{
    int i,sol=0,len,poz,psol;
    freopen ("scmax.in","r",stdin);
    freopen ("scmax.out","w",stdout);
    scanf("%d", &n);
    for(i=1;i<=n;++i) scanf("%d", &a[i]);
    dp[1]=1; s[1]=a[1]; p[1]=1; len=1;
    for(i=2;i<=n;++i)
    {
        if(a[i]>s[len])
        {
            dp[i]=len+1; t[i]=p[len];
            s[++len]=a[i]; p[len]=i;
        }
        else
        {
            poz=lower_bound(s+1,s+len+1,a[i])-s-1;
            dp[i]=poz+1; t[i]=p[poz];
            s[dp[i]]=a[i]; p[dp[i]]=i;
        }
        if(sol<dp[i])
        {
            sol=dp[i]; psol=i;
        }
    }
    printf("%d\n", sol);
    for(len=0;psol;dp[++len]=a[psol],psol=t[psol]);
    reverse(dp+1,dp+len+1);
    for(i=1;i<=len;++i) printf("%d ", dp[i]);
    printf("\n");
    return 0;
}