Cod sursa(job #975062)

Utilizator andrettiAndretti Naiden andretti Data 18 iulie 2013 23:05:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
#include<algorithm>
#define maxn 100005
#define maxstep 1<<18
using namespace std;

int n;
int v[maxn],best[maxn],l[maxn],p[maxn];
int pos,len;

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

void print(int k)
{
    if(k==0) return;
    print(p[k]);
    printf("%d ",v[k]);
}

void solve()
{
    int i;
    int step;

    best[1]=1; l[1]=1; len=1;
    for(i=2;i<=n;i++)
    {
        step=maxstep;
        for(pos=0;step;step>>=1)
         if(pos+step<=len && v[l[pos+step]]<v[i])
          pos+=step;

        best[i]=best[l[pos]]+1;
        p[i]=l[pos];
        if(l[best[i]]==0 || v[l[best[i]]]>v[i]) l[best[i]]=i;
        len=max(len,best[i]);
    }
    printf("%d\n",len);
    for(i=1;i<=n;i++)
     if(best[i]==len) {print(i); break;}
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    read();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}