Cod sursa(job #216274)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 23 octombrie 2008 19:04:00
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <stdio.h>

long v[100000], st[100000], poz[100000], p[100000], n, i, j, k, c1, c2, c3;

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d", &n);
    k=0;
    for(i=1; i<=n; i++)
    {
        scanf("%d", &v[i]);
        if(st[k]<v[i])
        {
            k++;
            st[k]=v[i];
            p[i]=poz[k-1];
            poz[k]=i;
        }
        else
        {
            c1=1;
            c2=k;
            while(c2>c1)
            {
           //     printf("%d %d\n", c1, c2);
                c3=(c1+c2)/2;
                if(v[i]<=st[c3]) 
                    c2=c3;
                else
                    c1=c3+1;
            }
            st[c1]=v[i];
            p[i]=poz[c1-1];
            poz[c1]=i;
     //       printf("%d %d\n", c1, c2);
        }
    /*   for(j=1; j<=k; j++)
        printf("%d ", st[j]);
        printf("\n"); 
        for(j=1; j<=k; j++)
        printf("%d ", poz[j]);
        printf("\n");
        for(j=1; j<=n; j++)
        printf("%d ", p[j]);
        printf("\n");*/
    }
    c1=poz[k];
    for(i=k; i>1; i--)
    {
        st[i]=v[c1];
        c1=p[c1];
    }
    printf("%d\n", k);
    for(i=1; i<=k; i++)
    printf("%d ", st[i]);
    printf("\n");
    return 0;
}