Cod sursa(job #579987)

Utilizator drywaterLazar Vlad drywater Data 12 aprilie 2011 17:17:32
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>
FILE *f=fopen("scmax.in","r"),*g=fopen("scmax.out","w");
int n,v[100001],l[100001],bst[100001],pr[100001],i,pos,s,nr=1,max=1,k;
int main(void)
{
    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
    bst[1]=1;
    l[1]=1;
    pr[1]=0;
    for (i=2;i<=n;i++)
    {
        k=1;
        s=0;
        pos=0;
        while (k<=nr) k*=2;
        k/=2;
        while (k>=1)
        {
            if (s+k<=nr && v[l[s+k]]<v[i]) {pos=s+k; if (v[l[pos+1]]>=v[i]) break; s+=k;}
            k/=2;
        }
        bst[i]=pos+1;
        pr[i]=l[pos];
        l[pos+1]=i;
        if (nr==pos) nr++;
        if (bst[i]>bst[max]) max=i;
    }
    fprintf(g,"%d\n",bst[max]);
    i=max;
    while (i)
    {
        l[++l[0]]=i;
        i=pr[i];
    }
    for (i=l[0];i>=1;i--)
        fprintf(g,"%d ",v[l[i]]);

}