Cod sursa(job #2199081)

Utilizator daniel.vbVasile Daniel daniel.vb Data 26 aprilie 2018 17:23:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <stdio.h>

int n,a[100001],b[100001],l[100001],m,ant[100001];
FILE *f,*g;


int cauta(int x)
{
    int opt=0,mij,st,dr;
    st=1;dr=m;
    while(st<=dr)
    {
        mij=st+(dr-st)/2;
        if(x>a[b[mij]])
        {
            opt=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    return opt+1;
}

void smax()
{
    int i,crt;
    m=1;b[1]=1;ant[1]=0;l[1]=1;
    for(i=1;i<=n;i++)
    {
        crt=cauta(a[i]);
        l[i]=crt;
        if(crt>m)
            m=crt;
        b[crt]=i;
        ant[i]=b[crt-1];
    }
}

void scrie(int i)
{
    if(ant[i]>0)
        scrie(ant[i]);
    fprintf(g,"%d ",a[i]);
}

int main()
{
    int i;

    f=fopen("scmax.in","r");
    g=fopen("scmax.out","w");

    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(f,"%d",&a[i]);

    smax();
    fprintf(g,"%d\n",m);
    scrie(b[m]);
}